2017-04-12 39 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"