2011-12-19 70 views
0

如何在包含更多數組的數組中搜索鍵。 比如我想搜索在「改編」的「鑰匙」,回到這一點:搜索數組中的鍵(PHP)

arr["some_inner_array"]["another_array_possible"][key"] 

array_key_exists可以告訴我,如果它存在,但當然我真正需要的價值...

我希望我的問題是清楚的...

編輯: 基於下面的答案,我設法做的應該是一個遞歸函數:

function look_in_array ($array, $key) { 
      if (isset($array[$key])) 
       return $array[$key]; 
    foreach ($array as $item) { 
     if (is_array($item)) { 
      $value = look_in_array ($item,$key); 
      if ($value) 
       return $value; 
     }    
    } 
} 
+0

如何是你要求的不同於$ arr [「some_inner_array」] [「another_array_possible」] [「key」]'? – Jon 2011-12-19 13:58:08

+0

到目前爲止你的代碼是什麼? – SERPRO 2011-12-19 14:03:43

+0

我不知道密鑰是否在這裏arr [「some_inner_array」] [「another_array_possible」] [key「]。也許是這裏:arr [」completely_different_array「] [key」] – 2011-12-19 14:04:52

回答

1

這個功能應該工作:

function array_key_exists_recursive($searchKey, $array) 
{ 
    $result = false; 

    foreach($array as $key => $value) 
    { 
     if(is_array($array[$key])) 
     { 
      $result = array_key_exists_recursive($searchKey, $array[$key]); 
     } 
     else if(array_key_exists($searchKey, $array)) 
     { 
      $result = $array[$searchKey]; 
     } 

     if($result) 
      break; 
    } 
    return $result; 
} 

〔實施例:

$array = array("a" => array("b" => "1", "c" => "2")); 


var_dump(array_key_exists_recursive("c", $array)); //Result: 2 
+0

不,我正在尋找$ key $ ARR。也許它的$ arr [「completely_different_array」] [$ key] – 2011-12-19 14:01:45

+0

我編輯了我的答案,其代碼應該適合你。 – SERPRO 2011-12-19 14:22:10

+0

是的,工作。謝謝! – 2011-12-19 14:39:16

0

你可能只是想問:

isset(arr["some_inner_array"]["another_array_possible"]["key"]) 

將這項工作嗎?否則,也許地名釋義你要完成將幫助我們來幫助你:)什麼好一點

0

您需要遍歷在第一陣列中的所有元素,然後使用array_key_exists()

foreach($arr as $inner1) { 
    foreach($inner1 as $inner2) { 
     if array_key_exists($inner2, $key) { 
      echo $inner2[$key]; 
      break 2; // if you only want the first match 
     } 
    } 
} 
+0

如果我不知道有多少嵌套數組呢? – 2011-12-19 14:07:30

+0

數組不能有兩個元素具有相同的角度相同的密鑰... – piotrekkr 2011-12-19 14:22:35

+0

@piotrekkr:當然,但另一個數組可能具有相同的密鑰! – ThiefMaster 2011-12-19 16:42:35

0

試試這個:

/** 
* @param $path array containing path 
* @param $array search array 
* @return element matching path or null 
*/ 
function arr_search($path, &$array){ 
    $tmp = &$array; 
    for($i = 0; $i < count($path); $i++){ 
     if(!isset($tmp[$path[$i]])) return null; 
     $tmp = &$tmp[$path[$i]]; 
    } 
    return $tmp; 
} 
$arr = array(
    'a' => array(
     'b' => array(
      'c' => 'abc', 
     ), 
     'd' => array('ad'), 
    ), 
    10 => array(100, 200, 300), 

); 
var_dump(arr_search(array('a', 'b', 'c'), $arr)); 

var_dump(arr_search(array('a', 'd'), $arr)); 

var_dump(arr_search(array(10, 100), $arr)); 

var_dump(arr_search(array(10, 1), $arr)); 

//編輯前面的例子是錯誤的,所以這裏是新的:)

function arr_search($key, $array){ 
    $values = array(); 
    if(array_key_exists($key, $array)) $values[] = $array[$key]; 
    $stack = array_values($array); 
    while($tmp = array_pop($stack)){ 
     if(is_array($tmp)){ 
      foreach($tmp as &$v){ 
       array_push($stack, $v); 
      } 
      if(array_key_exists($key, $tmp)){ 
       $values[] = $tmp[$key]; 
      } 
     } 
    } 
    return $values; 
} 
$arr = array(
    'a' => array(
     'b' => array(
      'c' => 'abc', 
     ), 
     'd' => array('ad'), 
    ), 
    'e' => array(
     'a' => array(
      'b' => 'abc', 
     ), 
     'b' => array('xyz'), 
    ), 

    10 => array(100, 200, 300), 

); 
var_dump(arr_search('b', $arr)); 

var_dump(arr_search(0, $arr)); 
+0

但事情是我不知道路徑。我所知道的只是關鍵。它可以在陣列中的任何地方... – 2011-12-19 14:25:44

+0

對不起,我以爲你知道路徑。 – piotrekkr 2011-12-19 14:29:10

+0

在我的帖子中檢查新版本 – piotrekkr 2011-12-19 14:46:14