Как пробегать получать стоимость array php recursivamente?

Я занимаю помощь, чтобы уметь пробегать мультипространственную договоренность в php и получать Вашу стоимость. Договоренность соответствует меню нескольких уровней.

В Array изображения я нуждаюсь в том, чтобы извлечь идентификации договоренности, и в случае, если идентификация будет находиться внутри children, каково знание - Ваша идентификация отец, так как не все Статьи у него есть дети. Я помещу пример ниже.

introducir la descripción de la imagen aquí

Здесь находится та же договоренность в коде.

[
    [
        "id"=>1,
        "children"=>[
            [
                "id"=>2,
                "children"=>[
                    [
                        "id"=>3,
                        "children"=>[
                            ["id"=>4]
                        ]
                    ],
                    [
                        "id"=>5
                    ]
                ]
            ]
        ]
    ],
    [
        "id"=>6,
        "children"=>[
            [
                "id"=>7,
                "children"=>[
                    [
                        "id"=>8,
                        "children"=>[
                            [
                                "id"=>9
                            ]
                        ]
                    ],
                    [
                        "id"=>9
                    ]
                ]
            ]
        ]
    ]
];

Например

[ ['id'=>1, 'parent' => null], ['id'=>2, 'parent' => 1], ['id'=>3, 'parent' => 2] ]

2
задан 25.06.2016, 06:13
3 ответа

Здесь я оставляю тебе перекурсивное решение. Идея состоит в том, чтобы создавать функцию, которую делал бы siguinte:

  1. Пересеки все элементы array
  2. Войди в array вывода Ваш пойдите и Ваш отец (null для элементов "корня")
  3. Если узел имеет "children"
    • Сохраняй "id" узла
    • Пересеки перекурсивным способом элементы "children"
    • Войди в array вывода Ваш "пойдите" и стоимость отца (который уже не будет null)
    • Возвращается в шаг 3
  4. Позвони в функцию, которую ты создал с твоим array происходя null как стоимость "id" отца

Такой он такой, как остался бы (прокомментированный) код:

// encuentraParents: función recursiva para encontrar padres
// $entrada: array con elementos a procesar
// $salida: array de salida con el id del elemento y el id del padre
// $padre: id del padre del array $entrada que se procesa
function encuentraParents($entrada, &$salida, $padre) {
    // para cada elemento del array 
    foreach($entrada as $valor) {
        // añade una entrada al array de salida indicando su id y el de su padre
        $salida[] = array( "id" => $valor["id"], "parent" => $padre );

        // si el elemento tiene children
        if (isset($valor["children"] ) ) {
            // procesa los hijos recursivamente indicando el id del padre
            encuentraParents( $valor["children"], $salida, $valor["id"] );
        }
    }
}

// el array que compartiste en tu pregunta
$objeto = [
    [
        "id"=>1,
        "children"=>[
            [
                "id"=>2,
                "children"=>[
                    [
                        "id"=>3,
                        "children"=>[
                            ["id"=>4]
                        ]
                    ],
                    [
                        "id"=>5
                    ]
                ]
            ]
        ]
    ],
    [
        "id"=>6,
        "children"=>[
            [
                "id"=>7,
                "children"=>[
                    [
                        "id"=>8,
                        "children"=>[
                            [
                                "id"=>9
                            ]
                        ]
                    ],
                    [
                        "id"=>9
                    ]
                ]
            ]
        ]
    ]
];

// el array de salida donde tendrás los valores al terminar
$salida = array();

// llamada inicial a la función recursiva con null como id del padre
encuentraParents($objeto, $salida, null);

Если ты делаешь один print_r $salida после того, как этот код работает, это результат, который ты получаешь (хотя порядок может меняться):

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

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

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

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

    [4] => Array
        (
            [id] => 5
            [parent] => 2
        )

    [5] => Array
        (
            [id] => 6
            [parent] => 
        )

    [6] => Array
        (
            [id] => 7
            [parent] => 6
        )

    [7] => Array
        (
            [id] => 8
            [parent] => 7
        )

    [8] => Array
        (
            [id] => 9
            [parent] => 8
        )

    [9] => Array
        (
            [id] => 9
            [parent] => 7
        )

)
1
ответ дан 24.11.2019, 14:05
  • 1
    Функционируй в perfecci и # 243; n, большое спасибо. – Jedidias 25.06.2016, 21:33

Я оставляю тебе следующий код, он надеялся, что он может служить тебе помощью, направлял как основание array_walk_recursive php.

Внимание: Ты будешь наблюдать, что я написал тебе "шаги", это путеводитель, для того, чтобы поняли лучше, как "читается" рукописный шрифт, в конце кода ты это поймешь лучше.

<?php 
    //Este es una simulación de tu Array
    $array = [0=>["id"=>1,"children"=>[0=>["id"=>2,"children"=>[0=>["id"=>3,"children"=>[0=>["id"=>3]]]]]]]];
    $ar = $arr = array(); //Se declaran 2 arrays que contendrán los valores que vamos a iterar.
    /*Creamos una función que se apoyará el recorrido recursivo (esto mas adelante lo vemos )*/
    function a($i){ //Paso 2
     global $ar; //Accedamos al array declarado fuera de este ámbito, por eso el; global
     array_push($ar,$i); //Agregamos en valor $i al arreglo $ar.
     array_walk_recursive($ar,'b'); //Ahora hacemos recursivo el arreglo que actualmente agregamos con la función b(que esta debajo). Paso 3
    }
    //Esta es la función b la cual hicimos uso hace 2 lineas que básicamente lo que hace es apoyar el método recurviso del arreglo ar

    function b($a,$b){ //Paso 4
     global $arr; //Accedemos al arreglo que esta declarado fuera del ambito
     $arr[$b] = ["id"=>$a,"parent"=>($b==0?null:$b)]; //El arreglo $arr le agregamos los valores que ocupas, estableciendo la estructura que tu ocupas.
    }
    array_walk_recursive($array,"a"); // Ahora aquí es donde inicia todo el script, ya que inicialmente va hacer recursivo el array llamado; $array, Observa que te voy a listar el como va "corriendo" todo el script; Paso 1
   echo "<pre>"; 
   print_r($ar); //Imprimimos los valores que contiene el Array $ar. Paso 6
   echo "</pre>"; 
?>

Конечный результат будет:

 Array(
[0]=>Array
    (
     [id]=> 1
     [parent]=>
    )
    [1]=>Array
    (
     [id]=> 2
     [parent]=>1
    )
[2]=>Array
    (
     [id]=> 3
     [parent]=>2
    )
[3]=>Array
    (
     [id]=> 3
     [parent]=>3
    )
)
1
ответ дан 24.11.2019, 14:05
  • 1
    Привет, спасибо за твой ответ. Я попытался c и # 243; я говорю и, если оно функционирует хорошо, только у него есть один согрешите и # 241; или деталь надеялась, что ты помогаешь мне небольшому количеству м и # 225; s пожалуйста. Когда у array есть 2 ребенка, он говорит мне, что parent второго сына - Ваш брат. [ "id"=>2, "children"=>[ [ "id"=>3, "children"=>[ ["id"=>4] ] ], [ "id"=>5 ] ] ] – Jedidias 25.06.2016, 06:17
  • 2
    Это кажется, что возвращает как отец предыдущий брат вместо отца узла – Alvaro Montoro♦ 25.06.2016, 10:25

Потому что ты не пытаешься охранять все родители в array, и всех детях в другом.

показал Тебе, что пример

$arrayDatos = array();//Este seria tu array
$arrayPadres = array();
$contPadres = 0;
$arrayHijos = array();
for ($a = 0; $a < sizeof($arrayDatos); $a++)
{
    $arrayPadres[$contPadres] = $arrayDatos[$a]['id];
    $contPadres++;
}

С примером детей ты делаешь то же самое. И потом ты пробегаешь for родителей и внутри for детей. И если idPadre array детей соответствует с id array родителей, ты это охраняешь в новом array, и так имеешь каждым idPadre все составные части дети

Я надеюсь, что он подает тебе

0
ответ дан 24.11.2019, 14:05

Теги

Похожие вопросы