【问题标题】:PHP multidimensional array search by key and return parents keys [duplicate]PHP多维数组按键搜索并返回父键[重复]
【发布时间】:2014-02-10 10:37:59
【问题描述】:

我的数组看起来像这样:

$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);

任何帮助将不胜感激,我只是无法解决这个问题;)

【问题讨论】:

  • 递归遍历有什么问题?你试过了吗?
  • @Rikesh 是的,这是重复的,抱歉。我一直在寻找答案,但结果就是这个没有出来:/

标签: php arrays search multidimensional-array key


【解决方案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
*/

【讨论】:

    【解决方案2】:

    你可以使用递归函数来解决这个问题。

    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 => 数组(53,152,431);

    【讨论】:

      猜你喜欢
      • 2014-11-11
      • 1970-01-01
      • 2017-11-16
      • 2014-04-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-03-23
      相关资源
      最近更新 更多