2010-12-08 2 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 или менее 16 единиц, идентификатор, как 4 штуки на <ul>
  • 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

Интересный вопрос. Я бы порекомендовал, чтобы вы сразу не приняли ответ, отвечая на этот вопрос, действительно хороший ответ может занять некоторое время. – 2010-12-08 18:05:12

+1

«если есть более 16 предметов, я бы хотел, чтобы они были равномерно распределены»? Определите «равномерно распределить». – 2010-12-08 18:06:56

+1

Ваши условия не являются самосогласованными: сортировка. Вы хотите, чтобы последовательные элементы были в порядке строк (подразумеваемые примером) или порядке столбцов (подразумевается «если есть 17 элементов, 17-й элемент должен будет перейти в первый столбец») – 2010-12-08 18:07:34

ответ

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)); 
} 
2

Если я вас правильно понял, вы хотите разделить свои элементы в четыре колонки «разумно», так что списки могут логически считаться при размещении бок о бок. Если это так, то это следует сделать трюк:

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>"; 
}; ?> 
Смежные вопросы