在嵌套数组中搜索值

问题描述 投票:5回答:6

我有一个数组如下

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)

也适合我,但我需要匹配所有包含配件的钥匙 - 不知道如何做到这一点

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

php multidimensional-array
6个回答
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');

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

希望能帮助到你。

M.

编辑:array_walk http://www.php.net/manual/en/function.array-walk.php上的PHP文档


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;
        }
    }
}

0
投票

您可以使用

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

来自this库,使用'key1.key2.key3'['key1', 'key2', 'key3']指定的键从多维数组中获取值,如果未找到任何元素,则回退到默认值。使用您的示例,它将如下所示:

if (Arr::getNestedElement($array, 'accessory.id') == 211)
© www.soinside.com 2019 - 2024. All rights reserved.