【问题标题】:Search array by key branch按关键分支搜索数组
【发布时间】:2014-10-29 06:58:45
【问题描述】:

我有一个如下所示的数组:

$array = array (
    [level_1] => array (
        [level_2] => array (
            [level_3] => something
        )
    ),
    [level_12] => array (
        [level_2] => somethingelse
    ),
    [level_13] => array (
        [level_22] => array (
            [level_3] => something
        )
    ),
);

键或值并不总是唯一的,但分支是唯一的。
我有一个看起来像这样的字符串:

$string = 'level_1-level_2-level_3';

这些是分支的键。

我需要以某种方式从基于该字符串的数组中获取值吗? 像这样:

$string_array = explode('-', $string);
$array[$string_array[0]][$string_array[1]][$string_array[2]] // something

但由于深度可能不同,这不是一个可行的解决方案...

【问题讨论】:

  • 你需要创建一个递归函数,收集结果。
  • 只需创建一个名为 $result 的变量,使其等于 $array,然后在 $string_array 上运行一个循环,使 $result = $result[$string_array[$i]]

标签: php arrays


【解决方案1】:

试试这个简单的例子,不需要递归函数:

function get_item( $path, $array ) 
{
    $paths = explode( '-', $path );

    $result = $array;       
    foreach ( $paths as $path) {
        isset( $result[$path] ) ? $result = $result[$path] : $result = false;
    }

    return $result; 
}

$path = 'level_1-level_2-level_3';
echo get_item( $path, $array );

【讨论】:

  • 如果结果为假,循环中不应该有一个中断吗?还是可以将布尔值视为数组?
  • 我想应该是这样,但是 PHP 在以这种方式使用 isset() 时不会抛出任何警告或通知
【解决方案2】:

试试这个:

    $array = array (
    'level_1' => array (
        'level_2' => array (
            'level_3' => 'something'
        )
    ),
    'level_12' => array (
        'level_2' => 'somethingelse'
    ),
    'level_13' => array (
        'level_22' => array (
            'level_3' => 'something'
        )
    ),
);
$string = 'level_1-level_2-level_3';
$keys = explode('-', $string);

echo getItemIterative($keys, $array);
echo "\n";
echo getItemRecursive($keys, $array);


function getItemIterative($keys, $array)
{
    $value = null;
    foreach ($keys as $key) {
        if ($value == null) {
            $value = $array[$key];
        }
        if (is_array($value) && array_key_exists($key, $value)) {
            $value = $value[$key];
        }
    }
    return $value;
}

function getItemRecursive($keys, $array)
{
    $key = array_shift($keys);
    $value = $array[$key];
    if (empty($keys)) {
        return $value;
    } else {
        return getItemRecursive($keys, $value);
    }
}

【讨论】:

    【解决方案3】:

    创建一个最初指向数组根的$result 变量,然后循环遍历$string_array 的各个级别,直到$result 指向您正在寻找的叶子。

    // stuff you already have:
    
    $array = array(...); // your big array
    $string = 'level_1-level_2-level_3';
    $string_array = explode('-', $string);
    
    // new stuff:
    
    $result = $array;
    foreach ($string_array as $level) {
        $result = $result[$level];
    }
    
    echo $result; // 'something'
    

    工作示例:Ideone

    【讨论】:

    • $string 可以正常工作,如果不正常会抛出未定义索引错误。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-12-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-04
    • 2018-02-21
    相关资源
    最近更新 更多