2010-04-22 185 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; 
     } 
    } 
}