为了账号安全,请及时绑定邮箱和手机立即绑定

如何在PHP多维数组中按key=>value搜索

如何在PHP多维数组中按key=>value搜索

PHP
长风秋雁 2019-06-15 13:02:20
如何在PHP多维数组中按key=>value搜索在多维数组中找到键值对的所有子数组有任何快速获取方法吗?我不能说数组有多深。简单示例数组:$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"));我想函数必须是递归的,才能降到最深的水平。
查看完整描述

3 回答

?
烙印99

TA贡献1829条经验 获得超13个赞

代码:

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

如果效率很重要,您可以编写它,这样所有递归调用都会将它们的结果存储在同一个临时的$results数组而不是将数组合并在一起,如下所示:

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通过引用而不是通过值获取它的第四个参数;&是至关重要的。

FYI:如果您的PHP版本较早,则必须在打电话search_r而不是在宣言中。也就是说,最后一行变成search_r($subarray, $key, $value, &$results).


查看完整回答
反对 回复 2019-06-15
?
忽然笑

TA贡献1806条经验 获得超5个赞

怎么样?SPL而不是版本?这样你就不用打字了:

// I changed your input example to make it harder and// to show it works at lower depths:$arr = array(0 => array('id'=>1,'name'=>"cat 1"),
             1 => array(array('id'=>3,'name'=>"cat 1")),
             2 => array('id'=>2,'name'=>"cat 2"));//here's the code:

    $arrIt = new RecursiveIteratorIterator(new RecursiveArrayIterator($arr));

 foreach ($arrIt as $sub) {
    $subArray = $arrIt->getSubIterator();
    if ($subArray['name'] === 'cat 1') {
        $outputArray[] = iterator_to_array($subArray);
    }}

最棒的是,基本上相同的代码将通过使用RecursiveDirectoryIterator而不是RecursiveArrayIterator来遍历目录。SPL是roxor。

关于SPL,唯一令人沮丧的是,它在网络上被记录得很糟糕。但是,有几本PHP书籍涉及到一些有用的细节,特别是Pro PHP;而且您可能也可以在Google上搜索更多信息。


查看完整回答
反对 回复 2019-06-15
  • 3 回答
  • 0 关注
  • 1086 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信