Использование массива PHP в качестве пути индекса - PullRequest
2 голосов
/ 12 июля 2011

У меня есть иерархический путь массива в плоском массиве PHP, например: $path = array('fruit', 'banana', 'fresh');

Я определяю свой многомерный массив как $tree.Как бы вы использовали $path для установки / получения соответствующего узла в $tree?$tree[$path] = 'blablabl'; выдает «Недопустимая ошибка смещения».Я не уверен, как бы я вытеснил () путь к строке и использовал eval () для получения индекса.Какой самый простой способ сделать это?

Ответы [ 2 ]

2 голосов
/ 12 июля 2011

Поскольку массив - это массив, а PHP ничего не знает о деревьях, вы должны самостоятельно определить путь к многомерному массиву, но это не сложно.

Итератив

$result = $tree;
foreach ($path as $step) {
  $result = $result[$step];
}

или рекурсивный

function resolve_tree ($tree, $path) {
  return empty($path)
         ? $tree
         : resolve_tree ($tree[$path[0]], array_slice($path, 1));
}

Обратите внимание, что это простейшие решения.Например, вы должны позаботиться о том, чтобы данный ключ из $path существовал, прежде чем пытаться получить к нему доступ.

Обновление: я пропустил часть "set" в вопросе.Без ссылок это не так уж забавно, поэтому я предлагаю полностью переключаться на объекты вместо массивов.Не обязательно, чтобы вы создали класс.Вы можете просто использовать stdClass.Это даже чувствовало бы немного больше "дерева" ish

1 голос
/ 13 июня 2016

Я решил ту же проблему со ссылками:

function &walk_path(array &$root, array $path)
{
    $cursor = &$root;
    foreach ($path as $e) { $cursor = &$cursor[$e]; }
    return $cursor;
}

$db = [];
$tmp = &walk_path($db, ["users","deanna", "favourite food"]);
$tmp = "chocolate";
print_r($db);

будет производить

Array
(
    [users] => Array
        (
            [deanna] => Array
                (
                    [favourite food] => chocolate
                )

        )

)

Обратите внимание, что, поскольку PHP autovivicates , это создаст любые несуществующие ключи либо в виде массива, единственным ключом которого будет следующий элемент в пути, либо пустым, если это конечный узел. К счастью, это именно то поведение, которое мне было нужно. Тем не менее, мне все еще кажется немного неудобным то, что я сам должен написать эту функцию на языке, который сосредоточен на ее массивах. Любые предложения по сокращению очень приветствуются.

...