PHP多维数组按键和返回父键搜索

时间:2014-02-10 10:37:59

标签: php arrays search multidimensional-array key

我的数组看起来像这样:

$array = array(
    53 => array(
        'name' => 'category',
        'subcats' => array(
            42 => array(
                'name' => 'subcategory',
            ),
            152 => array(
                'name' => 'subcategory',
                'subcats' => array(
                    431 => array(
                        'name' => 'subsubcategory'
                    )
                )
            )
        )
    ),
    94 => array(
        'name' => 'category'
    ),
    12 => array(
        'name' => 'category',
        'subcats' => array(
            67 => array(
                'name' => 'subcategory',
            ),
            237 => array(
                'name' => 'subcategory',
            ),
            109 => array(
                'name' => 'subcategory',
            ),
            32 => array(
                'name' => 'subcategory',
        )
    )
);

正如您所看到的,键是数字,但这些是类别的ID,可以无限地嵌套在一起。我需要的是在这个数组中搜索特定的ID并返回它的数组及其父元素。我们可以放心地假设即使在子类别数组中密钥也不会重复 - 它们是来自MySQL AI字段的ID;

因此,搜索关键字431的预期结果将是:

array(53, 152, 431);

任何帮助都会受到赞赏,我只是无法绕过这个;)

2 个答案:

答案 0 :(得分:1)

这有效 -

function find_id_list($array, $key){
    if(in_array($key,array_keys($array))){
        return Array($key);
    }
    foreach($array as $k=>$v){
        if(in_array("subcats",array_keys($v))){
            $result = find_id_list($v["subcats"], $key);
            if ($result !== null){
                array_unshift($result,$k);
                return $result;
            }
        }
    }
    return null;
}

输出:

$val = find_id_list($array, 431);
var_dump($val);
/*  OUTPUT
    array
      0 => int 53
      1 => int 152
      2 => int 431
*/

$val = find_id_list($array, 109);
var_dump($val);
/*  OUTPUT
    array
      0 => int 12
      1 => int 109
*/

$val = find_id_list($array, 0);
var_dump($val);
/*  OUTPUT
    null
*/

答案 1 :(得分:0)

您可以使用递归函数来解决此问题。

function searchmulti($arr, $num)
{
    if (!isset($arr[$num])) {
        foreach ($arr as $key => $subarr)
        {
            if (isset($subarr['subcats']))
            {
                $ret = searchmulti($subarr['subcats'], $num);
                if ($ret)
                {
                    $ret[] = $key;
                    return $ret;
                }
            }
        }
    } else return array($num);
    return null;
}

$solution = array_reverse(searchmulti($array,431));

输出

$ solution =>阵列(53152431);