dt2015 2017-08-02 21:32
浏览 61
已采纳

如何通过多维数组的键递归搜索?

I am trying to create a recursive function that takes an array and looks for a property name children, and constructs an array out of the matching one.

This is not straight forward because I don't know which block of my JSON data will contain the key children, so I decided to write a recursive function.


I've tried

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

Result: Nothing from var_dump().


Desired result:

["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"]

Any hints/suggestions / helps on this be will be much appreciated!

  • 写回答

2条回答 默认 最新

  • dpmpa26468 2017-08-02 21:56
    关注

    Like Barmar siad "You have infinite recursion."

    This is my solution. It prints out all mac address

    function recursiveKeyFinder($array) {
        $result = [];
    
        $result[] = $array['macAddress'];
        if (isset($array['children'])) {
            foreach($array['children'] as $child){
                $result = array_merge($result,recursiveKeyFinder($child));
            }
        }
        return $result;
    }
    

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

    Hope this can help

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

悬赏问题

  • ¥15 我想在一个软件里添加一个优惠弹窗,应该怎么写代码
  • ¥15 fluent的在模拟压强时使用希望得到一些建议
  • ¥15 STM32驱动继电器
  • ¥15 Windows server update services
  • ¥15 关于#c语言#的问题:我现在在做一个墨水屏设计,2.9英寸的小屏怎么换4.2英寸大屏
  • ¥15 模糊pid与pid仿真结果几乎一样
  • ¥15 java的GUI的运用
  • ¥15 Web.config连不上数据库
  • ¥15 我想付费需要AKM公司DSP开发资料及相关开发。
  • ¥15 怎么配置广告联盟瀑布流