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>
Перекопал все мануалы и исхдники и классы... Ничего не работает... Может кто то посоветует как действовать? Возможно есть какие то иные решения?
Имеется массив категорий, полученный из таблицы БД:
/** * 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 - это ваш массив категорий.
По идее, ничего не забыл.