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 关于#matlab#的问题:在模糊控制器中选出线路信息,在simulink中根据线路信息生成速度时间目标曲线(初速度为20m/s,15秒后减为0的速度时间图像)我想问线路信息是什么
  • ¥15 banner广告展示设置多少时间不怎么会消耗用户价值
  • ¥16 mybatis的代理对象无法通过@Autowired装填
  • ¥15 可见光定位matlab仿真
  • ¥15 arduino 四自由度机械臂
  • ¥15 wordpress 产品图片 GIF 没法显示
  • ¥15 求三国群英传pl国战时间的修改方法
  • ¥15 matlab代码代写,需写出详细代码,代价私
  • ¥15 ROS系统搭建请教(跨境电商用途)
  • ¥15 AIC3204的示例代码有吗,想用AIC3204测量血氧,找不到相关的代码。