Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/233.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 如何按多维数组的键进行递归搜索?_Php_Arrays_Json_Search_Recursion - Fatal编程技术网

Php 如何按多维数组的键进行递归搜索?

Php 如何按多维数组的键进行递归搜索?,php,arrays,json,search,recursion,Php,Arrays,Json,Search,Recursion,我试图创建一个递归函数,该函数接受一个数组并查找属性名子项,然后从匹配的数组中构造一个数组 这不是直截了当的,因为我不知道我的JSON数据的哪个块将包含键子项,所以我决定编写一个递归函数 我试过了 $testDataJson = ' { "macAddress": "10:20:30:40:50:81", "type": "HGW", "children": [{ "macAddress": "98:D6:D6:D8:FF:34", "p

我试图创建一个递归函数,该函数接受一个数组并查找属性名
子项
,然后从匹配的数组中构造一个数组

这不是直截了当的,因为我不知道我的JSON数据的哪个块将包含键
子项
,所以我决定编写一个递归函数


我试过了

$testDataJson = '
{
    "macAddress": "10:20:30:40:50:81",
    "type": "HGW",
    "children": [{
        "macAddress": "98:D6:D6:D8:FF:34",
        "pendingMethods": false,
        "lastSeen": "2017-05-24T10:36:35",
        "lastSeenLight": "GREEN",
        "model": "AP7465CE-TN",
        "type": "WIRELESS_ACCESS_POINT"
    }, {
        "macAddress": "44:66:E9:A1:2C:DC",
        "pendingMethods": false,
        "lastSeen": "2017-05-24T10:39:01",
        "lastSeenLight": "GREEN",
        "model": "PLC 200+ DIV -TN",
        "type": "POWERLINE"
    }, {
        "macAddress": "D8:C2:A9:1C:44:47",
        "pendingMethods": "False",
        "lastSeen": "2017-05-24T10:39:01",
        "lastSeenLight": "GREEN",
        "model": "PG9073",
        "type": "POWERLINE",
        "children": [{
            "macAddress": "22:CD:E6:8F:8C:B8",
            "pendingMethods": false,
            "lastSeen": "2017-05-24T10:38:16",
            "lastSeenLight": "GREEN",
            "model": "PG9073",
            "type": "POWERLINE"
        }, {
            "macAddress": "13:E4:AB:33:36:AC",
            "pendingMethods": false,
            "lastSeen": "2017-05-24T10:29:13",
            "lastSeenLight": "GREEN",
            "model": "PG9072",
            "type": "POWERLINE_WIRELESS_ACCESS_POINT"
        }]
    }]
}';
$testDataArray = json_decode($testDataJson,true);

function recursiveKeyFinder($array) {
    $result = [];
    if (!isset($array['children']) AND is_array($array)) {
       return $result;
    }else {
        foreach($array['children'] as $child){
            $result['macAddress'] = $child['macAddress'];
        }
        return recursiveKeyFinder($array);
    }
}
var_dump(recursiveKeyFinder($testDataArray));
结果:
var\u dump()
中没有任何内容


预期结果:

["macAddress": "98:D6:D6:D8:FF:34",
"macAddress": "44:66:E9:A1:2C:DC",
"macAddress": "D8:C2:A9:1C:44:47",
"macAddress": "22:CD:E6:8F:8C:B8",
"macAddress": "13:E4:AB:33:36:AC"]

我该如何研究这一点呢?

就像Barmar siad“你有无限递归。”

这是我的解决方案。它打印出所有的mac地址

function recursiveKeyFinder($array) {
    $result = [];

    $result[] = $array['macAddress'];
    if (isset($array['children'])) {
        foreach($array['children'] as $child){
            $result = array_merge($result,recursiveKeyFinder($child));
        }
    }
    return $result;
}
这里是结果

array (size=6)
  0 => string '10:20:30:40:50:81' (length=17)
  1 => string '98:D6:D6:D8:FF:34' (length=17)
  2 => string '44:66:E9:A1:2C:DC' (length=17)
  3 => string 'D8:C2:A9:1C:44:47' (length=17)
  4 => string '22:CD:E6:8F:8C:B8' (length=17)
  5 => string '13:E4:AB:33:36:AC' (length=17)
希望这能像Barmar siad“你有无限递归”一样有所帮助

这是我的解决方案。它打印出所有的mac地址

function recursiveKeyFinder($array) {
    $result = [];

    $result[] = $array['macAddress'];
    if (isset($array['children'])) {
        foreach($array['children'] as $child){
            $result = array_merge($result,recursiveKeyFinder($child));
        }
    }
    return $result;
}
这里是结果

array (size=6)
  0 => string '10:20:30:40:50:81' (length=17)
  1 => string '98:D6:D6:D8:FF:34' (length=17)
  2 => string '44:66:E9:A1:2C:DC' (length=17)
  3 => string 'D8:C2:A9:1C:44:47' (length=17)
  4 => string '22:CD:E6:8F:8C:B8' (length=17)
  5 => string '13:E4:AB:33:36:AC' (length=17)

希望这能有所帮助PHP已经为这个操作提供了一个特定的工具:
array\u walk\u recursive()
;因此,没有必要重新发明轮子

在准备好json数据后,只需一次函数调用就可以快速、简洁地完成任务

省略第一个
macAddress
(不需要的)值是通过仅将带有“children”键的子数组传递到
array\u walk\u recursive()
来完成的

代码:()

结果:

array (
  0 => '98:D6:D6:D8:FF:34',
  1 => '44:66:E9:A1:2C:DC',
  2 => 'D8:C2:A9:1C:44:47',
  3 => '22:CD:E6:8F:8C:B8',
  4 => '13:E4:AB:33:36:AC',
)

或者,输入阵列可以这样准备:

$array=array_diff_key(json_decode($testDataJson,true),['macAddress'=>'']);

这将确保您不会意外地获取任何非子级
macAddress
值。

PHP已经为该操作提供了一个特定的工具:
array\u walk\u recursive()
;因此,没有必要重新发明轮子

在准备好json数据后,只需一次函数调用就可以快速、简洁地完成任务

省略第一个
macAddress
(不需要的)值是通过仅将带有“children”键的子数组传递到
array\u walk\u recursive()
来完成的

代码:()

结果:

array (
  0 => '98:D6:D6:D8:FF:34',
  1 => '44:66:E9:A1:2C:DC',
  2 => 'D8:C2:A9:1C:44:47',
  3 => '22:CD:E6:8F:8C:B8',
  4 => '13:E4:AB:33:36:AC',
)

或者,输入阵列可以这样准备:

$array=array_diff_key(json_decode($testDataJson,true),['macAddress'=>'']);

这将确保您不会意外地获取任何非子级
macAddress
值。

您有无限递归。您正在使用给定的相同数组进行递归调用。您也永远不会返回您在
foreach
循环中修改的
$result
。您试图得到的结果是什么?我一到家,立即开车回家就会更新。我正在尝试返回结果数组并使函数正常工作。我将添加更多详细信息您不能同时编码和驱动吗?在这个行业你永远也做不到。:)@Barmar:我更新了我的帖子,添加了我想要的结果,我试图从我的故障递归函数中得到它。你有无限递归。您正在使用给定的相同数组进行递归调用。您也永远不会返回您在
foreach
循环中修改的
$result
。您试图得到的结果是什么?我一到家,立即开车回家就会更新。我正在尝试返回结果数组并使函数正常工作。我将添加更多详细信息您不能同时编码和驱动吗?在这个行业你永远也做不到。:)@Barmar:我更新了我的帖子,添加了我想要的结果,我正试图摆脱递归函数的故障。