有没有什么快速的方法可以获得在多维数组中找到键值对的所有子数组?我不能说数组会有多深.

简单示例数组:

$arr = array(0 => array(id=>1,name=>"cat 1"),
             1 => array(id=>2,name=>"cat 2"),
             2 => array(id=>3,name=>"cat 1")
);

当我搜索key=name和value="cat 1"时,函数应返回:

array(0 => array(id=>1,name=>"cat 1"),
      1 => array(id=>3,name=>"cat 1")
);

我想函数必须是递归的,才能深入到最深层次.

推荐答案

代码:

function search($array, $key, $value)
{
    $results = array();

    if (is_array($array)) {
        if (isset($array[$key]) && $array[$key] == $value) {
            $results[] = $array;
        }

        foreach ($array as $subarray) {
            $results = array_merge($results, search($subarray, $key, $value));
        }
    }

    return $results;
}

$arr = array(0 => array(id=>1,name=>"cat 1"),
             1 => array(id=>2,name=>"cat 2"),
             2 => array(id=>3,name=>"cat 1"));

print_r(search($arr, 'name', 'cat 1'));

输出:

Array
(
    [0] => Array
        (
            [id] => 1
            [name] => cat 1
        )

    [1] => Array
        (
            [id] => 3
            [name] => cat 1
        )

)

如果效率很重要,您可以编写它,以便所有递归调用将其结果存储在同一个临时数组中,而不是将数组合并在一起,如下所示:

function search($array, $key, $value)
{
    $results = array();
    search_r($array, $key, $value, $results);
    return $results;
}

function search_r($array, $key, $value, &$results)
{
    if (!is_array($array)) {
        return;
    }

    if (isset($array[$key]) && $array[$key] == $value) {
        $results[] = $array;
    }

    foreach ($array as $subarray) {
        search_r($subarray, $key, $value, $results);
    }
}

关键在于,search_r通过引用而不是通过值获取其第四个参数;符号&至关重要.

仅供参考:如果你有一个旧版本的PHP,那么你必须在callsearch_r中指定引用传递部分,而不是在它的声明中.也就是说,最后一行变成search_r($subarray, $key, $value, &$results).

Php相关问答推荐

PHP日期操作,将多个日期输出为格式化字符串

PHP -多维数组到一维数组

在WooCommerce中设置带有国家/地区和年份前缀的顺序序号

添加登录:需要app.yaml仍然允许所有拥有Google帐户的人访问

免费送货柜台,考虑到折扣码

限制某些产品只能在WooCommerce的特定邮政编码/邮政编码范围内发货

在WooCommerce中只允许高价产品的BACS付款

将数据推入所有子数组条目

以编程方式同步 WPML 翻译更改 Woocommerce 产品销售价格

使用 php Carbon 获取两个日期之间的随机日期和时间

将自定义字段添加到管理产品 在 WooCommerce 3.2+ 中批量编辑

invalid_grant 和无效的 JWT 签名

Filament PHP v3:在禁用的表单字段上,ID 不会写入数据库

woocommerce checkout 页面上的自定义字段

当我激活插件时出现错误注意:未定义的偏移量:1

使用 Composer 找不到 Google APIClient 类

由于 PHP 版本不受支持,如何终止 PHP 脚本?

在WooCommerce中显示 checkout 的高级自定义字段(Advanced Custom Fields)并保存其值

如何在 Process facade 中转义特殊字符?

使用 Eloquent 更新现有的外键值