PHP: перебирать массив? - PullRequest
1 голос
/ 22 июня 2010
  • То, что я хочу, это функция, которая просматривает мой массив и возвращает все дети к конкретному узлу. Что такое самый подходящий способ сделать это? Будет ли необходима рекурсия в этом случае?

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

Вот мой массив:

Array
(
    [1] => Array (
            [id] => 1
            [parent] => 0

        )

    [2] => Array (
            [id] => 2
            [parent] => 1
        )

    [3] => Array (
            [id] => 3
            [parent] => 2
        )   
)

Большое спасибо,

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

function getAllChildren($id) {
    // Psuedocode
    return $array;
}

getAllChildren(1); // Outputs the following:

Array
(   
    [2] => Array (
            [id] => 2
            [parent] => 1
        )

    [3] => Array (
            [id] => 3
            [parent] => 2
        )   
)

Ответы [ 3 ]

4 голосов
/ 22 июня 2010
<code>$nodes = array( 1   => array (  'id'        => 1,
                                'parent'    => 0
                             ),
                2   => array ( 'id'         => 2,
                               'parent'     => 1
                             ),
                3   => array ( 'id'         => 3,
                               'parent'     => 2
                             )
                );


function searchItem($needle,$haystack) {
    $nodes = array();
    foreach ($haystack as $key => $item) {
        if ($item['parent'] == $needle) {
            $nodes[$key] = $item;
            $nodes = $nodes + searchItem($item['id'],$haystack);
        }
    }
    return $nodes;
}


$result = searchItem('1',$nodes);
echo '<pre>';
var_dump($result);
echo '
';

Нерекурсивная версия функции searchItem ():

function searchItem($needle,$haystack) {
    $nodes = array();
    foreach ($haystack as $key => $item) {
        if (($item['parent'] == $needle) || array_key_exists($item['parent'],$nodes)) {
            $nodes[$key] = $item;
        }
    }
    return $nodes;
}

(предполагает упорядочение родителей / детей, поэтому дочерний узел не включается в массив, если родитель не существует)

1 голос
/ 22 июня 2010

Проверьте функцию array_walk_recursive() в PHP:

http://www.php.net/manual/en/function.array-walk-recursive.php

1 голос
/ 22 июня 2010
<?php
function searchItem($needle)
{
    foreach ($data as $key => $item)
    {
        if ($item['id'] == $needle)
        {
            return $key;
        }
    }
    return null;
}
?>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...