2010-04-22 133 views
4

我有一個數組如下搜索值嵌套數組

array(2) { 
    ["operator"] => array(2) { 
    ["qty"] => int(2) 
    ["id"] => int(251) 
    } 
    ["accessory209"] => array(2) { 
    ["qty"] => int(1) 
    ["id"] => int(209) 
    } 
    ["accessory211"] => array(2) { 
    ["qty"] => int(1) 
    ["id"] => int(211) 
    } 
} 

我試圖找到一種方法來驗證一個ID值的陣列和返回布爾中存在。我試圖找出一個不需要創建循環的快速方法。使用in_array函數不起作用,而且我也讀到它很慢。

在PHP手冊中,有人推薦使用flip_array(),然後是isset(),但我無法讓它適用於二維數組。

做這樣的事情

if($array['accessory']['id'] == 211) 

也爲我工作,但我需要匹配包含附件的所有鍵 - 不知道該怎麼做

不管怎麼說,我在圈子裏打轉,並可以使用一些幫助。 這似乎應該很容易。謝謝。

+0

我打算建議的一個PHP函數是'array_walk_recursive',它不需要你做一個循環。但是,如果您的'key'具有數組值,那麼該函數不起作用,就像您的那樣。循環可能是唯一的方法。我可以問爲什麼沒有循環? – 2010-04-22 18:25:03

+0

@Anthony Forloney:我有點困惑。這個功能應該完全符合OP的要求。你能更好地解釋爲什麼它不起作用嗎?我看到的唯一問題是,即使匹配已經找到,它也會遍歷所有值。 – 2010-04-22 18:28:01

+0

當我檢查值是否存在時,它已經循環了id(包含在一個對象中)的所有值以匹配。我只是想縮短搜索時間。 – dardub 2010-04-22 18:30:37

回答

5

嘿dardub,你可以使用array_walk來驗證一個特定的值是否在你的數組中 - array_walk通過你的數組的al元素進行迭代,併爲它們應用一個提供的函數,所以基本上你需要創建這個函數。它的用法如下:

$arr = array(
    'one' => array('id' => 1), 
    'two' => array('id' => 2), 
    'three' => array('id' => 3) 
); 

function checkValue($value, $key) 
{ 
    echo $value['id']; 
} 

array_walk($arr, 'checkValue'); 

你只需要添加到你的函數,無論你需要什麼條件/驗證。

希望它有幫助。

M.

編輯:在array_walk PHP文檔http://www.php.net/manual/en/function.array-walk.php

+1

您應該添加一個鏈接到文檔,並且還提到您可以將第三個參數傳遞給'array_walk',並再次傳遞給回調函數(即,這是傳遞'id'來搜索的方式)。 – 2010-04-22 18:46:00

+0

我可以讓函數返回一個布爾值嗎?我無法讓這部分工作? – dardub 2010-04-22 18:48:05

+0

array_walk返回true或false,但取決於回調是否成功執行 - 您可以使用標誌(全局變量)來指示您查找的值是否被找到。 – falomir 2010-04-22 18:53:46

1

此功能非常有用in_array(211, $array['accessory']);它驗證了整個指定數組,看是否在那裏存在的價值,並返回true。

in_array

0
$map = array(); 
foreach ($arr as $v) { 
    $map[$v['id']] = 1; 
} 
//then you can just do this as when needed 
$exists = isset($map[211]); 

或者如果你需要與它相關

$map = array(); 
foreach ($arr as $k => $v) { 
    $map[$v['id']][$k] = $v; 
} 
print_r($map[211]); 
0
<?php 

//PHP 5.3 way to do it 

function searchNestedArray(array $array, $search, $mode = 'value') { 

    foreach (new RecursiveIteratorIterator(new RecursiveArrayIterator($array)) as $key => $value) { 
     if ($search === ${${"mode"}}) 
      return true; 
    } 
    return false; 
} 

$data = array(
    array('abc', 'ddd'), 
    'ccc', 
    'bbb', 
    array('aaa', array('yyy', 'mp' => 555)) 
); 

var_dump(searchNestedArray($data, 555)); 
0

我用一個靜態的方法,因爲我需要它在一個類中的數據,但如果你願意,你可以用它作爲一個簡單的功能。

/** 
* Given an array like this 
* array(
* 'id' => "first", 
* 'title' => "First Toolbar", 
* 'class' => "col-md-12", 
* 'items' => array(
*  array(
*   'tipo' => "clientLink", 
*   'id' => "clientLinkInsert" 
*  ) 
* ) 
*) 
* 
* and array search like this 
* array("items", 0, "id") 
* 
* Find the path described by the array search, in the original array 
* 
* @param array $array source array 
* @param array $search the path to the item es. ["items", 0, "tipo"] 
* @param null|mixed $defaultIfNotFound the default value if the value is not found 
* 
* @return mixed 
*/ 
public static function getNestedKey($array, $search, $defaultIfNotFound = null) 
{ 
    if(count($search) == 0) return $defaultIfNotFound; 
    else{ 
     $firstElementSearch = self::array_kshift($search); 

     if (array_key_exists($firstElementSearch, $array)) { 
      if(count($search) == 0) 
       return $array[$firstElementSearch]; 
      else 
       return self::getNestedKey($array[$firstElementSearch], $search, $defaultIfNotFound); 
     }else{ 
      return $defaultIfNotFound; 
     } 
    } 
}