2017-02-24 2 views
0

Ich versuche, mein Menü nach Alphabeten zu gruppieren und sie in Spalten aufzuteilen. So habe ich ein assoziatives Array, wo meine Artikel bereits nach Alphabeten sortiert sind.Sortierung von Menüelementen nach Spalten

foreach ($category['children'] as $children) { 
    $firstChar = $children['name'][0]; 


    // if character is a number set it as # 
    if (is_numeric($firstChar)) { 
    $firstChar = "#"; 
    } 

    if ($firstChar !== $previousChar) { 
    echo '<li class="submenu_tag">'.strtoupper($firstChar).'</li>'; 
    $previousChar = $firstChar; 
    } 

    echo '<li><a href="'.$children['href'].'">'.$children['name'].'</a></li>'; 
    $count++; 
    if ($count == 11) { 
    echo '</ul></div>'; 
    echo '<div><ul>'; 
    $count = 0; 
    } 
} 
echo '</ul></div>'; 

Was ich jetzt habe, wird dies ausgeben.

<div> <div>  <div> 
A  Cow  Fawn 
Apple Crab  Fish 
Ape    Fox 
Ant  D   
     Dog  G 
B     Gazette 
Boy  E   Goose 
Ball Elephant Gorilla 
Bad  Egg   
     Elk  H 
C     Hedgehog 
Camel F   Hen 
Cat  Falcon  
</div> </div>  </div> 

Das gewünschte Ergebnis wäre, wenn die folgenden paar Elemente, die in einer Gruppe gehört, 11 Zeilen nicht überschreiten werden (mit Ausnahme der Leerräume dazwischen), dann wird es an einen neuen div bewegen. Etwas wie folgt aus:

<div> <div>  <div> 
A  C   F 
Apple Cat  Falcon 
Ape  Cow  Fawn 
Ant  Crab  Fish 
        Fox 
B  D   
Boy  Dog  G  
Ball    Gazette 
Bad  E   Goose  
     Elephant Gorilla  
     Egg 
     Elk  ..... 
</div> </div>  </div> 
+0

können Sie eine Beispieleingabe geben! –

+0

ist nur '$ children ['id']' '$ children ['name']' und '$ children ['href']' – John

Antwort

0

Versuchen Sie diesen Code

function formatData($datas) 
{ 
    $outputs = []; 
    $previousChar = ""; 
    foreach ($datas as $data) { 
     $firstChar = $data['name'][0]; 
     if (is_numeric($firstChar)) { 
      $firstChar = "#"; 
     } 

     if ($firstChar !== $previousChar) { 
      $previousChar = $firstChar; 
      $outputs[$firstChar] = []; 
      //keep Key 
      $outputs[$firstChar][] = [ 
       'name' => $firstChar, 
      ]; 
     } 

     $outputs[$firstChar][] = $data; 
    } 
    return $outputs; 
} 

function crateItemHtml($item) 
{ 
    $output = '<li>'; 
    if (isset($item['href'])) { 
     $output .= '<a href="'.$item['href'].'">'; 
    } 
    if (isset($item['name'])) { 
     $output .= $item['name']; 
    } 
    if (isset($item['href'])) { 
     $output .= '</a>'; 
    } 
    $output .= '</li>'; 
    return $output; 
} 

$datas = formatData($categories); 

$maxRow = 11; 
$count = 0; 
if (!empty($datas)) { 

    echo '<div style="width:150px; float:left;"><ol>'; 
    foreach ($datas as $data) { 
     $totalGroup = count($data); 

     if (($count+$totalGroup) >= $maxRow) { 
      //create space 
      while ($count < $maxRow) { 
       $count++; 
       //add space 
       echo crateItemHtml([]); 
      } 
      $count = 0; 
      echo '</ol></div>'; 
      echo '<div style="width:150px; float:left;"><ol>'; 
     } 

     //can add in row 
     foreach ($data as $category) { 
      $count++; 
      echo crateItemHtml($category); 
     } 
     if ($count < $maxRow) { 
      $count++; 
      //add space 
      echo crateItemHtml([]); 
     } else { 
      $count = 0; 
      echo '</ol></div>'; 
      echo '<div style="width:150px; float:left;"><ol>'; 
     } 

    } 

    echo '</ol></div>'; 
} 

können Sie max Zeile in dieser Zeile ändern

$ maxrow = 11;