PHP « Создание списка категорий из массива PHP

Привет, мир!

Имеется массив категорий, полученный из таблицы БД:

/** * GeSHi (C) 2004 - 2007 Nigel McNie, 2007 - 2008 Benny Baumann * (http://qbnz.com/highlighter/ and http://geshi.org/) */ .php.geshi_code {font-family:monospace;} .php.geshi_code .imp {font-weight: bold; color: red;} .php.geshi_code .kw1 {color: #b1b100;} .php.geshi_code .kw2 {color: #000000; font-weight: bold;} .php.geshi_code .kw3 {color: #990000;} .php.geshi_code .co1 {color: #666666; font-style: italic;} .php.geshi_code .co2 {color: #666666; font-style: italic;} .php.geshi_code .co3 {color: #0000cc; font-style: italic;} .php.geshi_code .co4 {color: #009933; font-style: italic;} .php.geshi_code .coMULTI {color: #666666; font-style: italic;} .php.geshi_code .es0 {color: #000099; font-weight: bold;} .php.geshi_code .es1 {color: #000099; font-weight: bold;} .php.geshi_code .es2 {color: #660099; font-weight: bold;} .php.geshi_code .es3 {color: #660099; font-weight: bold;} .php.geshi_code .es4 {color: #006699; font-weight: bold;} .php.geshi_code .es5 {color: #006699; font-weight: bold; font-style: italic;} .php.geshi_code .es6 {color: #009933; font-weight: bold;} .php.geshi_code .es_h {color: #000099; font-weight: bold;} .php.geshi_code .br0 {color: #009900;} .php.geshi_code .sy0 {color: #339933;} .php.geshi_code .sy1 {color: #000000; font-weight: bold;} .php.geshi_code .st0 {color: #0000ff;} .php.geshi_code .st_h {color: #0000ff;} .php.geshi_code .nu0 {color: #cc66cc;} .php.geshi_code .nu8 {color: #208080;} .php.geshi_code .nu12 {color: #208080;} .php.geshi_code .nu19 {color:#800080;} .php.geshi_code .me1 {color: #004000;} .php.geshi_code .me2 {color: #004000;} .php.geshi_code .re0 {color: #000088;} .php.geshi_code span.xtra { display:block; }

array(11) {
  [0]=>
  &array(4) {
    ["category_code"]=>
    string(1) "0"
    ["category_parent"]=>
    string(1) "0"
    ["category_title"]=>
    string(10) "Categories"
    ["subcategories"]=>
    *RECURSION*
  }
  [1]=>
  &array(4) {
    ["category_code"]=>
    string(1) "1"
    ["category_parent"]=>
    string(1) "0"
    ["category_title"]=>
    string(16) "Analoog Kassetid"
    ["subcategories"]=>
    array(7) {
      [0]=>
      &array(4) {
        ["category_code"]=>
        string(1) "2"
        ["category_parent"]=>
        string(1) "1"
        ["category_title"]=>
        string(18) "Kopiamasina tooner"
        ["subcategories"]=>
        array(0) {
        }
      }
      [1]=>
      &array(4) {
        ["category_code"]=>
        string(2) "24"
        ["category_parent"]=>
        string(1) "1"
        ["category_title"]=>
        string(25) "Nõelprinteri kassett"
        ["subcategories"]=>
        array(1) {
          [0]=>
          &array(4) {
            ["category_code"]=>
            string(4) "4623"
            ["category_parent"]=>
            string(2) "24"
            ["category_title"]=>
            string(30) "Print-Rite Nõelprinteri k"
            ["subcategories"]=>
            array(0) {
            }
          }
        }
      }
  ...
 }
 


Из этого массива хотелось бы получить список вида:
/** * GeSHi (C) 2004 - 2007 Nigel McNie, 2007 - 2008 Benny Baumann * (http://qbnz.com/highlighter/ and http://geshi.org/) */ .html4strict.geshi_code {font-family:monospace;} .html4strict.geshi_code .imp {font-weight: bold; color: red;} .html4strict.geshi_code .kw2 {color: #000000; font-weight: bold;} .html4strict.geshi_code .kw3 {color: #000066;} .html4strict.geshi_code .es0 {color: #000099; font-weight: bold;} .html4strict.geshi_code .br0 {color: #66cc66;} .html4strict.geshi_code .sy0 {color: #66cc66;} .html4strict.geshi_code .st0 {color: #ff0000;} .html4strict.geshi_code .nu0 {color: #cc66cc;} .html4strict.geshi_code .sc-1 {color: #808080; font-style: italic;} .html4strict.geshi_code .sc0 {color: #00bbdd;} .html4strict.geshi_code .sc1 {color: #ddbb00;} .html4strict.geshi_code .sc2 {color: #009900;} .html4strict.geshi_code span.xtra { display:block; }

<ul>
  <li>Apple</li>
  <li>Banana</li>
  <li>Tangerine
    <ul>
      <li>Pear
        <ul>
          <li>Walnut</li>
          <li>Ice Cream</li>
          <li>Candy</li>
        </ul>
      </li>
      <li>Nectar</li>
    </ul>
  </li>
  <li>Honey</li>
  <li>Sweets</li>
</ul>
 


Перекопал все мануалы и исхдники и классы... Ничего не работает... Может кто то посоветует как действовать? Возможно есть какие то иные решения?

1 ответов


Итак, момент истины - вдруг кому понадобится. Внимание: комменты к коду для начинающих а не для профи )
В чем прикол этого массива? В том, что здес у каждого подмассива есть цифровой ключ, то есть это не просто массив вроде


$desserts = аrrау("Fruit Cup" => array ("calories" => "low","served" -> "cold","preparation" => "10 minutes"),"Brownies" => array ("calories" -> "high","served" => "piping hot","preparation" => "45 minutes"));
 
Вот наш массив:

$tree = array(
    0 => array(
        'tag' => 'NavigationMode',
        'value' => array(
                0 => array(
                        'tag' => 'Title',
                        'value' => 'Introduction'
                ),
                1 => array(
                        'tag' => 'NavigationNode',
                        'value' => array(
                                0 => array(
                                        'tag' => 'Title',
                                        'value' => 'Sub Intro'
                                )
                        )
                )
        )
    ),
    1 => array(
        'tag' => 'NavigationMode',
        'value' => array(
                0 => array(
                        'tag' => 'Title',
                        'value' => 'Module 1'
                )
        )
    )
);
 
Разница очевидна, правда?
Что жн нам теперь с ним делать?
Собственно функция:

  public function actionCategoryHtmlList($category){
                // Погнал список
    echo '<ul>';
                // Каждый эелемент аписка потрошим
    foreach ($category as $item) {
                        // Элемент списка с вложенным списком отправляем в переменную
      $childCats = $item['subcategories'];
                        // Внимание!
      $titleCat = array_shift($childCats);
                        // Открываем элемент списка, показываем название категории и чего там нам еще надо...
      echo "<li>" . $item['category_title'];
                        // Если во вложенной категории есть еще одна, гоу все заново
      if (count($childCats) > 0) {
                                // $this-> потому что находимся внутри класса
        $this->actionCategoryHtmlList($childCats);
      }
                        // Закрываем эелемент списка с возможными подпсписками
      echo "</li>";
    }
               // Закрываем список
    echo '</ul>';
  }
 
Про функцию array_shift

На странице вызывается так:

// Так как у меня класс, то:
$gocategories = new CategoryActions();  
// $CategoriesTree это готовый, сформированный массив с категориями и подкатегориями.      
$gocategories -> actionCategoryHtmlList($CategoriesTree);
 

Еще почитать:
- Как из списка категорий, полученного из базы, получить иерархически сортированный массив? или тут .
- Сабж, собственной персоной + еще варианты.

Всем спасибо )


protected function renderCategoryMenuItemHtml($category)
{
  $html = array();

  $html[] = '<li>';
  $html[] = $category['category_title'];

  $htmlChildren = '';
  foreach ($category['subcategories'] as $child) {
    $htmlChildren .= $this->renderCategoryMenuItemHtml($child);
  }
  if (!empty($htmlChildren)) {
    $html[] = '<ul>';
    $html[] = $htmlChildren;
    $html[] = '</ul>';
  }

  $html[] = '</li>';

  $html = implode("\n", $html);
  return $html;
}
 
Потом в любом месте во вьюхе (для многих фреймворков это будет верным):

<ul><?php echo $this->renderCategoryMenuItemHtml($categoriesArray) ?></ul>
 
Где $categoriesArray - это ваш массив категорий.

По идее, ничего не забыл.