php 在嵌套数组中搜索值[重复]

jei2mxaa  于 2023-11-16  发布在  PHP
关注(0)|答案(7)|浏览(133)

此问题在此处已有答案

How to check if a specific value exists at a specific key in any subarray of a multidimensional array?(18个回答)
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(),但我无法让它适用于二维数组。
做一些像

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


也会为我工作,但我需要匹配所有包含配件的键-不知道如何做到这一点
无论如何,我在原地打转,需要一些帮助。这看起来应该很容易。谢谢。

flseospp

flseospp1#

array_walk()可以用来检查一个特定的值是否在数组中; -它迭代所有的数组元素,这些元素作为第二个参数传递给函数。例如,可以像下面的代码那样调用函数。

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

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

array_walk($arr, 'checkValue');

字符串

ffscu2ro

ffscu2ro2#

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

wrrgggsh

wrrgggsh3#

$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]);

1dkrff03

1dkrff034#

<?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));

字符串

ruyhziif

ruyhziif5#

我使用了一个静态方法,因为我需要它在一个类中,但如果你愿意,你可以使用它作为一个简单的函数。

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

字符串

uwopmtnx

uwopmtnx6#

您可以使用

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

字符串
this库中使用指定的键(如'key1.key2.key3'['key1', 'key2', 'key3'])从多维数组中获取值,如果没有找到元素,则回退到默认值。使用您的示例,它将如下所示:

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

ycggw6v2

ycggw6v27#

如果要根据数组中的值进行搜索,可以使用PHP array_filter,这是用于此目的的,
用于检索兄弟值,如示例中的qty

array_values(
    array_filter(
        $yourArray,
        fn ($inner)=> $inner['id'] == 211
    )
)[0]['qty'] ?? [];

字符串
或者用于退出内部数组,如示例中的accessory209:

array_keys(
    array_filter(
        $yourArray,
        fn ($inner)=> $inner['id'] == 211
    )
)[0] ?? [];

相关问题