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 使用C#,asp.net读取Excel文件并保存到Oracle数据库
  • ¥15 C# datagridview 单元格显示进度及值
  • ¥15 thinkphp6配合social login单点登录问题
  • ¥15 HFSS 中的 H 场图与 MATLAB 中绘制的 B1 场 部分对应不上
  • ¥15 如何在scanpy上做差异基因和通路富集?
  • ¥20 关于#硬件工程#的问题,请各位专家解答!
  • ¥15 关于#matlab#的问题:期望的系统闭环传递函数为G(s)=wn^2/s^2+2¢wn+wn^2阻尼系数¢=0.707,使系统具有较小的超调量
  • ¥15 FLUENT如何实现在堆积颗粒的上表面加载高斯热源
  • ¥30 截图中的mathematics程序转换成matlab
  • ¥15 动力学代码报错,维度不匹配