2013-10-17 93 views
16

我有一個多維數組,例如(這可能是很多層次深):檢查多維數組中是否存在特定數組鍵 - PHP

$array = Array ( 
    [21] => Array () 
    [24] => Array ( 
     [22] => Array () 
     [25] => Array ( 
      [26] => Array () 
     ) 
    ) 
) 

我想遍歷它來查看某個項是否存在:

$keySearch=22; // key seraching for 

function findKey($array, $keySearch) { 
    foreach ($array as $item){ 
     if (isset($item[$keySearch]) && false === findKey($item[$keySearch], $item)){ 
      echo 'yes, it exists'; 
     } 
    } 
} 

findKey($array, $keySearch); 

但覺得沒有什麼。循環中是否有錯誤?

+0

看到這個:: http://stackoverflow.com/a/2948985/350858 –

回答

25

我與您的代碼打得到它的工作:

function findKey($array, $keySearch) 
{ 
    foreach ($array as $key => $item) { 
     if ($key == $keySearch) { 
      echo 'yes, it exists'; 
      return true; 
     } elseif (is_array($item) && findKey($item, $keySearch)) { 
      return true; 
     } 
    } 
    return false; 
} 
+1

不應該:「if(isset($ array [$ key]))」be:「if(is_array($ array [$ key]))」?顯然$ key是在$數組中設置的,因爲foreach正在循環該數組。 –

+0

'if(is_array($ item))findKey($ item,$ keySearch);' - 此調用的返回值丟失。 – VolkerK

+1

我編輯過,以壓縮if塊。如果這是我的代碼,我寧願用'||'來使用一個'if'。 *使用括號作爲邏輯要求。 – mickmackusa

0

肯定有些錯誤,這大致是你在做什麼之後? (未經測試的代碼):

$ keySearch = 22; //爲

function findKey($array, $keySearch) 
    { // check whether input is an array 
    if(is_array($array) 
    { 
    foreach ($array as $item){ 
     if (isset($item[$keySearch]) || findKey($item, $keysearch) === true) 
     { 
     echo 'yes, it exists'; 
     return true; 
     } 
    } 
    } 
} 
+3

將不勝感激的-1的解釋這個答案。 –

28

array_key_exists()關鍵seraching是helpful

然後是這樣的:

function multiKeyExists(array $arr, $key) { 

    // is in base array? 
    if (array_key_exists($key, $arr)) { 
     return true; 
    } 

    // check arrays contained in this array 
    foreach ($arr as $element) { 
     if (is_array($element)) { 
      if (multiKeyExists($element, $key)) { 
       return true; 
      } 
     } 

    } 

    return false; 
} 

工作例如:http://codepad.org/GU0qG5su

+1

非常複雜的答案...謝謝 –

3
function findKey($array, $keySearch) 
{ 
    // check if it's even an array 
    if (!is_array($array)) return false; 

    // key exists 
    if (array_key_exists($keySearch, $array)) return true; 

    // key isn't in this array, go deeper 
    foreach($array as $key => $val) 
    { 
     // return true if it's found 
     if (findKey($val, $keySearch)) return true; 
    } 

    return false; 
} 

// test 
$array = Array ( 
    21 => Array (24 => 'ok'), 
    24 => Array ( 
     22 => Array (29 => 'ok'), 
     25 => Array ( 
      26 => Array (32 => 'ok') 
     ) 
    ) 
); 

$findKeys = Array(21, 22, 23, 24, 25, 26, 27, 28, 29, 30); 
foreach ($findKeys as $key) 
{ 
    echo (findKey($array, $key)) ? 'found ' : 'not found '; 
    echo $key.'<br>'; 
} 
0

返回false如果不如果存在,則返回第一個實例;

function searchArray(array $array, $search) 
{ 
    while($array) { 
     if(isset($array[ $search ])) return $array[ $search ]; 
      $segment = array_shift($array); 
      if(is_array($segment)) { 
       if($return = searchArray($segment, $search)) return $return; 
      } 
     } 
    } 
    return false; 
} 
2

你可以寫在一行代碼! 是的!

str_contains(json_encode($array), 'key')

0

這裏是一個行的解決方案:

echo strpos(json_encode($array), $key) > 0 ? "found" : "not found"; 

這陣列含有JSON當量的字符串轉換,然後它使用字符串作爲對strpos的草堆()的參數函數,它使用$ key作爲參數($ key是在JSON字符串中查找的值)。

它可以幫助做到這一點,看看在轉換後的字符串:echo json_encode($array);

一定要在單引號針參數,那麼雙引號,因爲在JSON字符串名稱/值對的名稱部分將圍繞它出現雙引號。舉例來說,若跌破則$key = '"22"'數組中尋找22會給正確的結果此數組中未發現

$array = 
Array ( 
     21 => Array (), 
     24 => 
     Array ( 
      522 => Array (), 
      25 => 
       Array ( 
       26 => Array () 
      ) 
     ) 
    ); 

但是,如果單引號在$key = "22"不放過,作爲再一個不正確的結果發現將導致上面的數組。

編輯:進一步的改進是搜索$key = '"22":';只需要在數組中存在"22"的值。即。另外,這種方法不是防彈的。不正確的發現可能會導致如果有數組的值包含字符串'"22":'

相關問題