2014-02-07 29 views
0

我的数组:如何风格这个名单,使之看起来像一个金字塔

array (

     array(

     ['name'] => 'test1', 
     ['level'] => 1 

     }, 
     array(

     ['name'] => 'test2', 
     ['level'] => 2 

     }, 

     array(

     ['name'] => 'test3', 
     ['level'] => 2 

     }, 
     array(

     ['name'] => 'test4', 
     ['level'] => 3 

     }, 
     array(

     ['name'] => 'test5', 
     ['level'] => 3 

     }, 
     array(

     ['name'] => 'test6', 
     ['level'] => 3 

     }, 
     array(

     ['name'] => 'test7', 
     ['level'] => 3 

     }, 



    ) 

我想要什么:

    ________ 
       |  | 
       | test1 | 
       |________| 
     ________    ________ 
     |  |   |  | 
     | test2 |   | test3 | 
     |________|   |________| 
________ ________ ________ ________ 
|  | |  | |  | |  | 
| test4 | | test5 | | test6 | | test7 | 
|________| |________| |________| |________| 

,我已经有一个功能,通过水平呈现:

public static function f($rows) 
{ 
    $str = ''; 
    $level = 0; 
    $first_li_mode = true; 
    foreach ($rows as $row) { 
     if ($level > $row['level']) { 
      $str .= '</li></ul>' . "\n"; 
      $str .= '</li><li><a href="#">' . $row['name'] . '</a>' . "\n"; 
      $first_li_mode = true; 
     } elseif ($row['level'] > $level) { 
      $str .= '<ul><li><a href="#">' . $row['name'] . '</a>' . "\n"; 
      $first_li_mode = false; 
      ; 
     } else { 
      if (!$first_li_mode) { 
       $str .= '</li>' . "\n"; 
      } else { 
       $first_li_mode = false; 
      } 
      $str .= '<li><a href="#">' . $row['name'] . '</a>' . "\n"; 
     } 

     $level = $row['level']; 
    } 
    while ($level > 0) { 
     $str .= '</li></ul>' . "\n"; 
     $level--; 
    } 
    return $str; 
} 

它所产生:

<ul> 
    <li class="level_1"> 
    <a href="#"> 
    test1 
    </a> 
    <ul> 
    <li class="level_2"> 
    <a href="">test2</a> 
    </li> 
    <li class="level_3"> 
    <a href="">test3</a> 
    </li> 
    </ul> 
    </li> 
</ul> 

...等,可以说,每一位家长都在这个名单2名儿童,问题是:如何样式此列表,使它看起来像一个金字塔,使每一个父节点(相对于孩子的)出现在他们中间的顶部,如上图所示?无论深度级别如何,也许我需要在渲染函数中进行一些计算以在每个级别上进行偏移?但是如何实现?

+0

我不知道如何计算孩子的偏移量,你能给我一个关于如何在我的循环中计算它的提示吗?我只需要在这种情况下 – user3274945

+0

我曾尝试一些CSS帮助:保证金左:($行[“级别”] * 20)像素;不过这并没有为我工作,请任何想法?我只是不知道如何正确 – user3274945

+0

你需要计数的项目的数量在每个级别,然后计算从那里偏移样式。最好使用在CSS百分比 –

回答

0

这是我想尝试。你可能需要调整一下输出,看看它是否适合你。

$sorted_arr=array(); 
foreach ($arr as $a){ 
    $sorted_arr[$a['level']][]=$a['name'] 
} 
ksort($sorted_arr); 
$css=""; 
foreach ($sorted_arr as $level => $s){ 
    $count=count($s); 
// First count the number of elements in each level. 
    $spacing=1/($count+1)*100-5; 
// Get the percentage of the offset, then minus the 1/2 width of each li element (say 10%) 
    $css.=".level_$level li {margin-left:".$spacing."%; width:10%} \n"; 
} 
echo $css; 
+0

无法理解这是如何工作的,孩子们的积分比家长多,请你能多给一点描述例子吗?,我很困惑 – user3274945

+0

1 /($ count + 1)应该使它成为倒数关系。 1项给你50%,2项给你33%等等。 –

+0

Maaan my pyramide break this code,I'am the whole day to do this,still no luck,please can you give a example on http ://jsfiddle.net/ - 在这里或添加更多的细节到你的答案? – user3274945

相关问题