Как организовать многомерные массивы в PHP? - PullRequest
2 голосов
/ 02 марта 2011

У меня есть иерархия категорий, как показано ниже, но я не знаю, как перечислить, хотя у них есть РОДИТЕЛИ.

 $array[1] = 'A';
 $array[1]['children'][1] = 'A1';
 $array[1]['children'][2] = 'A2';

 $array[2] = 'B';
 $array[2]['children'][1] = 'B1';
 $array[2]['children'][1]['children'][1] = 'B1-1';
 $array[2]['children'][1]['children'][2] = 'B1-2';

Это должно выглядеть в несортированных тегах списка (ul> li):

 A
   A1
   A2
 B
   B1
     B1-1
     B1-2

Итак, как мне создать этот список категорий, используя многомерный массив?

Ответы [ 3 ]

2 голосов
/ 02 марта 2011

Прежде всего, ваше объявление массива неверно, сначала вы присваиваете 'A' $array[1], затем вы пытаетесь "преобразовать" $array[1] в ассоциативный массив, чтобы добавить дочерние элементы.

выможет сделать что-то вроде этого, может быть:

 $array[1]['name'] = 'A';
 $array[1]['children'][1]['name'] = 'A1';
 $array[1]['children'][2]['name'] = 'A2';

 $array[2]['name'] = 'B';
 $array[2]['children'][1]['name'] = 'B1';
 $array[2]['children'][1]['children'][1]['name'] = 'B1-1';
 $array[2]['children'][1]['children'][2]['name'] = 'B1-2';

Затем вы можете показать свой список с помощью функции, подобной этой:

function make_list($array) {
    echo '<ul>';
    foreach ($array as $a) {
        echo '<li>' . $a['name'];
        if (isset($a['children']) && is_array($a['children'])) {
            make_list($a['children']);
        }
        echo '</li>';
    }
    echo '</ul>';
}

Я надеюсь, что мой код понятен.

2 голосов
/ 02 марта 2011

Поскольку, казалось бы, вам не нужны никакие вторичные атрибуты, вы не должны ни начинать с перечислимого массива, ни использовать children подмассивы.В вашем случае вы можете избежать использования записей в качестве имен ключей:

$hierarchy["A"] = array();
$hierarchy["A"]["A1"] = array();
$hierarchy["A"]["A2"] = array();

$hierarchy["B"] = array();
$hierarchy["B"]["B1"] = array();
$hierarchy["B"]["B2"]["B1-1"] = array();
$hierarchy["B"]["B2"]["B1-2"] = array();

Эта структура просто предполагает, что все записи могут иметь дочерние элементы и, следовательно, в любом случае могут быть массивами.Обратите внимание, как это можно сжать в:

$hierarchy = array(
    "A" => array(
        "A1" => array(), 
        "A2" => array(),
    ),
    "B" => array(
        "B1" => array(
            "B1-1" => array(),
            "B1-2" => array(),
        ), 
    ),
);

Порядок сохраняется, так как PHP-массивы в любом случае являются упорядоченными словарями.

Итерации по этой структуре аналогичны другим вариантам, за исключением того, что фактические данныеуже содержится в ключах.

1 голос
/ 02 марта 2011

Правильный подход к многомерным массивам - использование рекуррентности.Псевдокод будет выглядеть так:

function tree($data){
    if (has_kids($data))
        return tree($data['kids']);
    }
    return $data[0];
}
var_dump(tree($data));

Кроме того, чтобы узнать о теории, ознакомьтесь с этой статьей , о обходе дерева (многомерные категории являются примером деревьев).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...