【问题标题】:PHP Search deep nested array for multiple key/value combinationsPHP搜索多个键/值组合的深层嵌套数组
【发布时间】:2018-07-05 15:30:34
【问题描述】:

我有一个深层嵌套的多维数组。我希望能够搜索多个键/值对并返回其父匹配项。

示例数组:

//$array
Array
(
[0] => Array
        [ID] => 1
        [Name] => My Name
        [GroupLocations] => Array
            (
                [0] => Array
                    (

                        [GroupId] => 111
                        [LocationId] => 222 
                        [Location] => Array
                            (
                                [Name] => My Location
                                [Street1] => 555 Somewhere Lane
                                [City] => City
                                [County] => County
                                [State] => CA
                                [Country] => US
                                [PostalCode] => 00000
                            )
                    )

            )
    )
[1] => Array
        [ID] => 2
        [Name] => My Other Name
        [GroupLocations] => Array
            (
                [0] => Array
                    (

                        [GroupId] => 222
                        [LocationId] => 333 
                        [Location] => Array
                            (
                                [Name] => My Other Location
                                [Street1] => 666 Other Rd.
                                [City] => City
                                [County] => County
                                [State] => CA
                                [Country] => US
                                [PostalCode] => 00000
                            )
                    )

            )
    )
)

类似于PHP Search an Array for multiple key / value pairs,但考虑到更深层次。

因此,如果我有上面的示例数组,并且想要过滤数组并根据需要搜索数组的不同嵌套部分的过滤器获取结果

$filters = array(
  'ID' => $_GET[‘ID’],
  'LocationId' => $_GET['LocationId']
);

$results = filterMyArray($array, $filters);

其中 filterMyArray 函数将使用过滤器数组递归过滤所有级别并返回所有匹配的索引/。努力想出一个体面的解决方案。关于如何完成此任务的任何建议?

【问题讨论】:

  • 你的描述有点模糊。添加一些各种输入的预期输出示例确实有助于阐明您想要获得的内容。
  • 感谢您查看@Don'tPanic。我已经更新了我的问题,希望能得到澄清。
  • 你也许可以在这里使用'treewalker'库来帮助你---->github.com/lukascivil/TreeWalker

标签: php


【解决方案1】:

也许下面的递归函数可以帮助你;您可以更改要查找的键 ($key),它将返回嵌套/多维数组中键的所有出现。

<?php
$arr = [
    [
        'ID' => 1,
        'Name' => 'My Name',
        'GroupLocations' => [
            [
                'GroupId' => 111,
                'LocationId' => 222,
                'Location' => [
                    'Name' => 'MyLocation',
                    'Street1' => '555 Somewhere Lane'
                ]
            ]
        ]
    ]   
];

$results = []; // the container for the search result(s)
$key = 'Name'; // the key we are looking for
findKey($arr, $key, $results); // invoke the search function

/** print the result of our search */
echo '<pre>';
var_dump($results);
echo '<pre>';

/**
 * @param array $arr the multidimensional array we are searching
 * @param string $key the key we are looking for
 * @param $results           passed by reference - in case the key is found, this array 'stores' the corresponding key-value pair.
 */
function findKey($arr = [], $key = '', &$results = [])
{
    foreach ($arr as $key0 => $value0) {
        if ($key0 == $key && !is_array($value0)) {
            $results[][$key] = $value0;
        }
        if (is_array($value0)) {
            findKey($value0, $key, $results);
        }
    }
    return false;
}

输出:

array(2) {
  [0]=>
  array(1) {
    ["Name"]=>
    string(7) "My Name"
  }
  [1]=>
  array(1) {
    ["Name"]=>
    string(10) "MyLocation"
  }
}

【讨论】:

  • 谢谢@lovelace 我一直在寻找这样的东西!你能解释一下我将如何返回搜索到的键的值吗?例如返回“我的名字”以便我可以将它分配给一个变量,而不是数组数字和键?
  • 不确定这是否是您所追求的,但可能类似于 this... - /* NEW *//* END NEW */ 之间的新代码。问题是嵌套数组中的同一个键(例如“名称”)可以有多个“命中”,因此您需要 $results 数组来存储它们。然后,您可以使用$$ 表示法遍历结果数组以将找到的值分配给新创建的变量。希望有帮助吗?
猜你喜欢
  • 2018-01-25
  • 1970-01-01
  • 2021-11-02
  • 2020-12-10
  • 1970-01-01
  • 1970-01-01
  • 2022-08-13
  • 2012-12-05
  • 2016-01-13
相关资源
最近更新 更多