在嵌套数组中搜索值

时间:2010-04-22 18:14:08

标签: php multidimensional-array

我有一个数组如下

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值并返回bool。我试图找出一种不需要创建循环的快速方法。使用in_array函数不起作用,我也读到它很慢。

在php手册中,有人建议使用flip_array()然后使用isset(),但我不能让它适用于2-d数组。

做类似

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

也适用于我,但我需要匹配包含附件的所有键 - 不知道如何做到

无论如何,我在旋转,并可以使用一些帮助。 这看起来应该很容易。感谢。

6 个答案:

答案 0 :(得分:6)

嘿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');

您只需要在函数中添加您需要的条件/验证。

希望它有所帮助。

微米。

编辑: array_walk http://www.php.net/manual/en/function.array-walk.php

上的PHP文档

答案 1 :(得分:1)

此函数很有用in_array(211, $array['accessory']);它验证整个指定数组,以查看您的值是否存在并返回true。

in_array

答案 2 :(得分: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]);

答案 3 :(得分: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));

答案 4 :(得分: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;
        }
    }
}

答案 5 :(得分:0)

您可以使用

Arr::getNestedElement($array, $keys, $default = null)
this库中

使用诸如'key1.key2.key3'['key1', 'key2', 'key3']之类指定的键从多维数组中获取值,如果未找到任何元素,则回退到默认值。使用您的示例,它看起来像:

if (Arr::getNestedElement($array, 'accessory.id') == 211)