Как получить конкретный вложенный массив на основе заданного совпадающего ключа? - PullRequest
0 голосов
/ 25 июня 2018

Как получить определенный вложенный массив на основе заданного сопоставленного ключа, используя встроенную функцию PHP

Сценарий

$id = 1035; // Searching ID

$a = [
    'id'=> 291,    
    'children' => [
        [
            'id'        => 1034,
            'children'  => [
                [
                    'id'      => 111,
                    'name'    => 'ABC',
                    'figure'  => '6 digits',  
                    'children'=> []  
                ],
                [
                    'id'        => 1035,
                    'lft'       => 'LEFT',
                    'children'  => [
                        [
                            'id'        => 1036,
                            'children'  => [
                                [
                                    'id'      => 222,
                                    'someKey' => 'some value',
                                    'children'=> []  
                                ]
                            ]
                        ],
                        [
                            'id'      => 333,
                            'someKey' => 'some value',
                            'children'=> []  
                        ]
                    ],
                ]
            ],
         ],
         [
            'id'        => 1024,
            'title'     => 'ABC',    
            'children'  => [

            ],
        ]
    ]
];

Обратите внимание, ключи 'id' и 'children' всегда рядом. Как получить "детей" из "1035" ID ..?

Ожидаемый результат

[
    [
        'id'        => 1036,
        'children'  => [
            [
                'id'      => 222,
                'someKey' => 'some value',
                'children'=> []  
            ]
        ],
    ],
    [
        'id'      => 333,
        'someKey' => 'some value',
        'children'=> []  
    ]
];

Пытались

function getRecursiveCategoryIds($key, $categories = []){
    $return = null;
    try {
        array_walk_recursive($categories, function($v, $k) use ($key, &$return){

            if (null != $return) {

                 // Run loop to get the next immediate "children" key
                 if ($k == 'children') {  // It's not matching anymore

                     $return = $v;
                     //return false;
                     throw new Exception;

                 }
             } else if($v == $key) {
                 // Found
                 $return = $v;
             }
        });
    } catch(Exception $e) {}

    return $return;
}

$d = getRecursiveCategoryIds($id, $a);
echo '<pre>D: '; print_r($d); die;    

Я пытался с помощью приведенного выше кода, но "if ($ k == 'children') {" больше не соответствует ..!

Любые предложения приветствуются ... (Встроенная функция PHP наиболее предпочтительна!)

Ответы [ 2 ]

0 голосов
/ 25 июня 2018

Вы можете использовать функцию внутри другой проверки:

$id=1035;
$a = [
    'id'=> 291,    
    'children' => [
        [
            'id'        => 1034,
            'children'  => [
                [
                    'id'      => 111,
                    'name'    => 'ABC',
                    'figure'  => '6 digits',  
                    'children'=> []  
                ],
                [
                    'id'        => 1035,
                    'lft'       => 'LEFT',
                    'children'  => [
                        [
                            'id'        => 1036,
                            'children'  => [
                                [
                                    'id'      => 222,
                                    'someKey' => 'some value',
                                    'children'=> []  
                                ]
                            ]
                        ],
                        [
                            'id'      => 333,
                            'someKey' => 'some value',
                            'children'=> []  
                        ]
                    ],
                ]
            ],
         ],
         [
            'id'        => 1024,
            'title'     => 'ABC',    
            'children'  => [

            ],
        ]
    ]
];


function nigsearch($arr,$id)
{
    if(gettype($arr) == 'array')
    foreach($arr as $key =>$list)
{

    if(gettype($list) == 'array'){
    if(isset($list['id']))
    {
        if($list['id'] ==$id)
            print_r($list['children']);


    }
        nigsearch($list,$id);
    }
}

}

foreach($a as $key)
{

    nigsearch($key,$id);


}
0 голосов
/ 25 июня 2018

Я смог это сделать.Пожалуйста, проверьте комментарии в коде:

<?php
    $id = 1035; // Searching ID
    $myObj = array();

    $a = [
        'id'=> 291,    
        'children' => [
            [
                'id'        => 1034,
                'children'  => [
                    [
                        'id'      => 111,
                        'name'    => 'ABC',
                        'figure'  => '6 digits',  
                        'children'=> []  
                    ],
                    [
                        'id'        => 1035,
                        'lft'       => 'LEFT',
                        'children'  => [
                            [
                                'id'        => 1036,
                                'children'  => [
                                    [
                                        'id'      => 222,
                                        'someKey' => 'some value',
                                        'children'=> []  
                                    ]
                                ]
                            ],
                            [
                                'id'      => 333,
                                'someKey' => 'some value',
                                'children'=> []  
                            ]
                        ],
                    ]
                ],
            ],
            [
                'id'        => 1024,
                'title'     => 'ABC',    
                'children'  => [

                ],
            ]
        ]
    ];

    function findObject($id, $obj) {
        global $myObj;
        // This is an object.
        if (isset($obj["id"])) {
            echo "Checking {$obj["id"]}<br />";
            // Check the id to what we need.
            if ($obj["id"] == $id) {
                // Yay! We found it. Return the object.
                echo "Yay we found {$obj["id"]}<br />";
                $myObj = $obj;
            }
            else {
                echo "Checking children of {$obj["id"]}<br />";
                // See if it has any children
                if (isset($obj["children"]) && count($obj["children"]) > 0) {
                    echo "There are children for {$obj["id"]}<br />";
                    foreach ($obj["children"] as $child) {
                        findObject($id, $child);
                    }   
                }
            }
        }
    }

    findObject($id, $a);
    print_r($myObj);

Вывод

Checking 291<br>Checking children of 291<br>There are children for 291<br>Checking 1034<br>Checking children of 1034<br>There are children for 1034<br>Checking 111<br>Checking children of 111<br>Checking 1035<br><strong>Yay we found 1035</strong><br><strong>Need to find a way to break out!</strong><br>Checking 1024<br>Checking children of 1024<br><br><strong>Found it!</strong><br>Array
(
    [id] => 1035
    [lft] => LEFT
    [children] => Array
        (
            [0] => Array
                (
                    [id] => 1036
                    [children] => Array
                        (
                            [0] => Array
                                (
                                    [id] => 222
                                    [someKey] => some value
                                    [children] => Array
                                        (
                                        )
                                )
                        )
                )
            [1] => Array
                (
                    [id] => 333
                    [someKey] => some value
                    [children] => Array
                        (
                        )
                )
        )
)

Демо:

...