2010-12-08 3 views
4

私は列に分割する必要がある動的な項目数を持っています。のは、私はこれを与えられてるとしましょう:動的な項目数を列に分割する

array("one", "two", "three", "four", "five", "six", "seven", "eight") 

私はこれを生成する必要があります。

<ul> 
    <li>one</li> 
    <li>two</li> 
    <li>three</li> 
    <li>four</li> 
</ul> 
<ul> 
    <li>five</li> 
    <li>six</li> 
    <li>seven</li> 
    <li>eight</li> 
</ul> 

ここではいくつかのルールがあります:

  • アイテムがない場合、私はしたくありません
  • 16個以下のアイテムがある場合は、<ul>
  • の4つのアイテムのようなIDですifそこには16個以上のアイテムがあります。私はそれを均等に広げたいと思います。
  • 私はアイテムをアルファベット順に並べ替える必要があります。 17個のアイテムがある場合、17番目のアイテムは最初の列に移動する必要がありますが、すべてを並べ替える必要があります。

私がこれまで持っているもの:

function divide($by, $array) { 
14  $total = count($array); 
15  $return = array(); 
16  $index=0; 
17  $remainder = $total % $by !== 0; 
18  $perRow = $remainder ? 
19   $total/$by + 1: 
20   $total/$by 
21   ; 
22 
23  for ($j = 0; $j<$by; $j++) { 
24   //$return[] = array(); 
25 
26   if ($index == 0) { 
27    $slice = array_slice($array, 0, $perRow); 
28    $index = $perRow; 
29    $return[$j] = $slice; 
30   } else { 
31    $slice = array_slice($array, $index, $perRow); 
32    $index = $index+$perRow; 
33    $return[$j] = $slice; 
34   } 
35  } 
} 

私は数を養うには、除算(4、$ arrRef)のように、数は列の#を指示するが、私はリファクタリングする必要があるので、それが決定

+1

興味深い質問です。本当に良い答えでこの質問に答えるとすぐに回答を受け入れないことをお勧めします。 –

+1

「16個以上のアイテムがあれば、均等に広げたいですか?」 「均等に分散」を定義します。 –

+1

あなたの条件は、一貫性がありませんre:ソート。連続する項目が行順(例で暗示される)または列順(「17の項目がある場合、17番目の項目は最初の列に移動する必要があります」と暗示されます) –

答えて

0

テストされていない列の数:

function divide($by, $list, $order = 'c') { 
    if (empty($list)) { 
     return array(); 
    } 

    if (count($list) <= 16) { 
     $by = 4; 
    } 

    $columnLists = array(); 
    for ($cIndex = 0; $cIndex < $by; $cIndex++) { 
     $columnLists[$cColumn] = array(); 
    } 

    switch ($order) { 
     case 'r': 
      foreach ($list as $cEntry) { 
       $columnLists[$cColumn][] = $cEntry; 
       $cColumn = ($cColumn + 1) % $by; 
      } 

      break; 
     case 'c': 
     default: 
      $maxColumnHeight = intval(count($list)/$by) + (count($list) % $by > 0 ? 1 : 0); 
      for ($cIndex = 0; $cIndex < $by; $cIndex++) { 
       $columnLists[$cColumn] = array_slice($list, $cIndex * $maxColumnHeight, $maxColumnHeight); 
      } 

      break; 
    } 

    return $columnLists; 
} 
3

あなたの要件が曖昧/かなり奇妙ですが、私はリストができるように、これは私が正しくあなたを理解している場合、あなたが

function columnize(array $set, $maxCols = 4) 
{ 
    if (count($set) <= 16) 
    { 
    return array_chunk($set, 4); 
    } 

    return array_chunk($set, ceil(count($set)/$maxCols)); 
} 
+0

私はこれが関数の外で行われるべきだと考えていますが、OPの目的のためには、関数内で配列の並べ替えを行うのも良い考えかもしれません。 – simshaun

2

を求めているのか、あなたは「インテリジェント」の4つの列にあなたの項目を分割しようとしているんだと思います横並びに置かれたときに論理的に読み取られる。その場合は、これはトリックを行う必要があります。

function columnize($items, $columns = 4, $min_per_column = 4) { 

    if(empty($items)) return array(); 

    $result  = array(); 
    $count  = count($items); 
    $min_count = $min_per_column * $columns; 

    if($count <= $min_count) { 
     $columns = ceil($count/$min_per_column); 
    } else {  
     $per_column = floor($count/$columns); 
     $overflow = count($items) % $columns; 
    } 

    for($column = 0; $column < $columns; $column++) { 
     if($count <= $min_count) { 
      $item_count = $min_per_column; 
     } else { 
      $item_count = $per_column; 
      if($overflow > 0) { 
       $item_count++; 
       $overflow--; 
      } 
     } 
     $result[$column] = array_slice($items, 0, $item_count); 
     $items = array_slice($items, $item_count); 
    } 

    return $result; 
} 

あなたがここでそれをテストすることができます。

http://www.ulmanen.fi/stuff/columnize.php

5

は、私は私のビューテンプレート内でこのコードを使用..

<?php 
$col = 3; 
$projects = array_chunk($projects, ceil(count($projects)/$col)); 

foreach ($projects as $i => $project_chunk) 
{ 
    echo "<ul class='pcol{$i+1}'>"; 
    foreach ($project_chunk as $project) 
     { 
     echo "<li>{$project->name}</li>"; 
    }; 
    echo "</ul>"; 
}; ?> 
+0

この非常に明るいアイデアは、私もこれを使いました。 – newbie

関連する問題