2017-04-12 36 views
1

我有以下多维数组生成动态菜单搜索多维数组:使用键和值的对

[ 
    "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。

+0

您的功能对我来说确实很好。你可以打印'$ this-> menu'并确保它与问题中发布的数组相同 –

回答

0

你可能想尝试做一个递归函数,然后放弃硬编码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 
0
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"