php - 如果值存在于另一个数组中,如何递归过滤数组

标签 php arrays recursion associative-array

我有两个数组。 第一个是结构,一个包含类别内所有元素的关联数组。类别的名称是该数组中的键。这些类别可以有不同的深度: 检查这个例子:

$structure = [
            'fruits'    => [
                'sweet' => [
                    'red' => [
                        'watermelon' =>['id' => 1],
                        'cherry' =>['id' => 2],
                        'litchi' =>['id' => 3]
                    ],
                    'white' => [
                        'coco' =>['id' => 13],
                        'lucuma' =>['id' => 14],
                    ]

                ],
                'sour'  => [
                    'lemon' =>['id' => 4],
                    'orange' =>['id' => 5],
                    'tangerine' =>['id' => 6]
                ],
            ],
            'colors'   => [
                'black' =>['id' => 7],
                'green' =>['id' => 8],
                'blue' => ['id' => 9]
            ],
            'names'   => [
                'jack' =>['id' => 10],
                'paul' =>['id' => 11],
                'peter' =>['id' => 12]
            ]
        ];

我有第二个数组,其中包含我要搜索的元素:

$results = ['coco', 'green','peter'];

我需要编写一个函数,给出一个输出数组,其中包含元素和它们所属的类别树。像这样的事情:

$resultsInStructure = [
            'fruits'    => [
                'sweet' => [
                    'white' => [
                        'coco' => ['id' => 13]
                    ]
                ]
            ],
            'colors'   => [
                'green' =>['id' => 8]
            ],
            'names'   => [
                'peter' =>['id' => 12]
            ]
        ];

当然,该函数需要递归。要么走第二个数组的第一个,只是我无法做到正确......任何帮助表示赞赏!

最佳答案

试试这个

function walk($arr,$results)
{
    if (is_array($arr))
    {
        $arrFound = [];
        $arrTmpReturn = [];
        foreach($arr AS $key => $val)
        {
            if (in_array($key, $results))
            {
                $arrFound = array_merge($arrFound,[$key => $val]);
            }
            $arrReturn = walk($val,$results);
            if (!is_null($arrReturn))
            {
                $arrTmpReturn = array_merge($arrTmpReturn,[$key => $arrReturn]);
            }
        }
        if (count($arrFound) > 0)   return $arrFound;
        if (count($arrTmpReturn) > 0) return $arrTmpReturn;
    }
}

print_r(walk($structure,$results));

关于php - 如果值存在于另一个数组中,如何递归过滤数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44432459/

相关文章:

c - 如何将剩余的 for 循环更改为递归函数?

php - 匿名递归 PHP 函数

php - mysql - 从多个表的 SELECT 语句中查找表名

perl - 如何从 Perl 数组中删除重复项?

python - pyparsing 在解析时是否知道递归表达式的深度?

python - 具有不同数量的 For 循环的函数(python)

c# - 我如何将此 C# 代码翻译成 PHP?

php - 用于优化的静态变量

javascript - 使用 JavaScript 中的动态属性对数组中的所有对象项求和

c++ - 在 C 中的大型数组上使用 realloc 的段错误