Поиск ключа в многомерном массиве с последующим изменением значения с помощью PHP - PullRequest
3 голосов
/ 21 июня 2011

У меня есть многомерный массив, который выглядит следующим образом

[0] => Array
    (
        [recordId] => 5
        [leaf] => 1
        [children] => Array
            (
                [0] => Array
                    (
                        [recordId] => 6
                        [leaf] => 1
                        [children] => Array
                            (
                                [0] => Array
                                    (
                                        [recordId] => 7
                                        [leaf] => 1
                                    )
                            )
                    )
                [1] => Array
                    (
                        [recordId] => 8
                        [leaf] => 1
                        [children] => Array
                            (
                                [0] => Array
                                    (
                                        [recordId] => 9
                                        [leaf] => 1
                                    )
                                [1] => Array
                                    (
                                        [recordId] => 10
                                        [leaf] => 1
                                    )
                            )
                    )
            )
    )

У каждого узла есть «листовой» ключ, который по умолчанию равен TRUE и имеет массив «children», если есть дополнительные узлы.

Мне нужно установить значение ключа 'leaf' в FALSE, если в узле содержится массив 'children'. Таким образом, только конечные узлы имеют обозначение leaf = TRUE.

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

Есть идеи, как мне это сделать на PHP?

Спасибо за помощь.

Ответы [ 3 ]

3 голосов
/ 21 июня 2011

Довольно просто на самом деле:

function leafOrNotLeaf(array $array) {
    foreach ($array as $key => $sub) {
        if (isset($sub['children'])) {
            $array[$key]['leaf'] = false;
            $array[$key]['children'] = leafOrNotLeaf($sub['children']);
        }
    }
    return $array;
}

$new_array = leafOrNotLeaf($array);
3 голосов
/ 21 июня 2011

Ходьба по факту $array:

array_walk($array, $walker = function (&$node) use (&$walker) {
    $node['leaf'] = (int) empty($node['children'])
        OR array_walk($node['children'], $walker);
});

Может быть, немного загадочно, поэтому вы должны любить PHP.

2 голосов
/ 21 июня 2011

Теоретически это должно работать:

function findChild(&$array){
     foreach($array as &$arr){
            if(isset($arr['children'])){
                  $arr['leaf'] = 0; //there are children
                  findChild($arr['children']);
            }
            else {
                  $arr['leaf'] = 1; //there are no children
            }
     }
}

Вот рабочая демонстрация: http://codepad.org/AnYiRpES

...