dongshukou0240 2018-03-17 20:25
浏览 64
已采纳

PHP递归练习构建数组

[
    'one/two' => 3,
    'one/four/0' => 5,
    'one/four/1' => 6,
    'one/four/2' => 7,
    'eight/nine/ten' => 11
]

I am attempting to build the above array based on $json_str:

$json_str = '{
    "one":
    {
        "two": 3,
        "four": [ 5,6,7]
    },
    "eight":
    {
        "nine":
        {
            "ten":11
        }
    }
}';

I built a recursive function that loops thru this $json_str but so far I can only get strings to output.

How would I build an array instead echoing a string?

Also, how would I get only index values that belong in the associative index to be there.

Currently I can only get all keys to print:

one/two => 3

one/two/four/0 => 5

one/two/four/0/1 => 6

one/two/four/0/1/2 => 7

one/eight/nine/ten => 11

Below is what I have so far:

<?php

function printAll($a, $prefix = '') {

  if (!is_array($a) && !is_object($a)) {

    $prefix = rtrim($prefix, '/');

    echo $prefix . ' => ' . $a, "
";

    return;
  }

  foreach($a as $k => $v) {

    $prefix .= $k . "/";

    printAll($v, $prefix);
  }
}


$json_str = '{
                "one":
                {
                    "two": 3,
                    "four": [ 5,6,7]
                },
                "eight":
                {
                    "nine":
                    {
                        "ten":11
                    }
                }
            }';


$object = json_decode($json_str);
printAll($object);
  • 写回答

2条回答 默认 最新

  • douhua1890 2018-03-17 20:41
    关注

    You could use an array to hold the keys of object, instead of using a string, and array_pop() to remove the last one at the end of the loop. So you have a stack of the keys which can be used to get the breadcrumb of the JSON data.

    function printAll(&$out = [], $a, $prefix = []) {
        foreach ($a as $key => $value) {
            $prefix[] = $key;  // add the key to "prefix"
            if (is_array($value) || is_object($value)) {
                printAll($out, $value, $prefix);
            }else{
                $out[implode('/', $prefix)] = $value;
            }
            // remove current key because we are no more inside it.
            array_pop($prefix);
        }
    }
    
    $json_str = '{"one": {"two": 3, "four": [ 5,6,7] }, "eight": {"nine": {"ten":11 } } }';
    
    $object = json_decode($json_str);
    $data = [];
    printAll($data, $object);
    print_r($data);
    

    Outputs:

    Array
    (
        [one/two] => 3
        [one/four/0] => 5
        [one/four/1] => 6
        [one/four/2] => 7
        [eight/nine/ten] => 11
    )
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

悬赏问题

  • ¥15 乌班图ip地址配置及远程SSH
  • ¥15 怎么让点阵屏显示静态爱心,用keiluVision5写出让点阵屏显示静态爱心的代码,越快越好
  • ¥15 PSPICE制作一个加法器
  • ¥15 javaweb项目无法正常跳转
  • ¥15 VMBox虚拟机无法访问
  • ¥15 skd显示找不到头文件
  • ¥15 机器视觉中图片中长度与真实长度的关系
  • ¥15 fastreport table 怎么只让每页的最下面和最顶部有横线
  • ¥15 R语言卸载之后无法重装,显示电脑存在下载某些较大二进制文件行为,怎么办
  • ¥15 java 的protected权限 ,问题在注释里