【问题标题】:Searching multidimensional array using a key and value pair使用键值对搜索多维数组
【发布时间】:2017-09-08 07:54:07
【问题描述】:

我有以下多维数组来构建动态菜单:

[
    "3gnitjUdm6" => [
        "name" => "Overview",
        "slug" => "overview",
        "priority" => 1,
        "pages" => [
            "i3OQlLqgqO" => [
                "name" => "Dashboard",
                "url" => "",
                "priority" => 2,
                "subpages" => [],
            ],
            "izma1tvjGd" => [
                "name" => "Settings",
                "url" => "/settings",
                "priority" => 4,
                "subpages" => [],
            ]
        ]
    ],
    "IcSujiIx9A" => [
        "name" => "Content",
        "slug" => "content",
        "priority" => 5,
        "pages" => [
            "3KJdhtCRuI" => [
                "name" => "Users",
                "url" => "/users",
                "priority" => 2,
                "subpages" => [],
            ],
            "M3zw9hq6rW" => [
                "name" => "Pets",
                "url" => "/pets",
                "priority" => 4,
                "subpages" => [],
            ],
        ],
    ],
]

每个部分都包含一个页面数组,每个页面可以包含一个子页面数组。我需要能够使用键值对搜索该数组以找到该部分的键。

private function _find_section($key, $value) {
    foreach($this->menu as $section_key => $section) {
        if(is_array($section[$key])) {
            foreach($section[$key] as $sub_key => $sub) {
                if($sub_key === $value) {
                    return $section_key;
                }
            }
        } elseif(is_string($section[$key])) {
            if($section[$key] === $value) {
                return $section_key;
            }
        } else {
            return false;
        }
    }
}

运行以下代码:

_find_section('name', 'Content')

总是返回 false。

【问题讨论】:

  • 你的函数在我看来没问题。您可以打印$this->menu 并确保它与您在问题中发布的数组相同

标签: php arrays function multidimensional-array


【解决方案1】:
function flatten(array $collection, array $nested_keys = []) {
    $output = [];
    foreach ($collection as $key => $value) {
        foreach ($nested_keys as $nested_key) {
            if (isset($value[$nested_key]) && is_array($value[$nested_key])) {
                $output = array_merge($output, flatten($value[$nested_key], [$nested_key]));
            }
        }
        $output[$key] = $value;
    }

    return $output;
}

function column(array $collection, string $key) {
    return array_combine(
        array_keys($collection),
        array_map(function ($row) use ($key) { return $row[$key]; }, $collection)
    );
}

function find_section(array $menu, string $key, string $value) {
    $set = column(flatten($menu, ['pages', 'subpages']), $key);

    return array_search($value, $set);
}

var_dump(find_section($menu, 'name', 'Dashboard')); // string(10) "i3OQlLqgqO"

【讨论】:

    【解决方案2】:

    您可能想尝试执行递归函数并放弃硬编码 foreach() 循环,然后您可以使用此方法轻松搜索数组的多个级别:

    function recurseFind($array,$findK,$findV,$last=false)
        {
            if(is_object($array))
                $array  =   (array) $array;
    
            foreach($array as $key => $value) {
                if($key == $findK && $value == $findV)
                    return $last;
    
                if(is_array($value))
                    $doFind =   recurseFind($value,$findK,$findV,$key);
    
                if(!empty($doFind))
                    return $doFind;
            }
        }
    
    print_r(recurseFind($arr,'name','Dashboard'));
    

    给你:

    i3OQlLqgqO
    

    【讨论】:

      猜你喜欢
      • 2017-01-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-10-16
      相关资源
      最近更新 更多