PHP JSON多维数组只输出1个结果

时间:2017-12-20 02:41:55

标签: php laravel

我被困在这几个小时。我需要获取数组的初始键和id。但是我只返回了1个结果。

以下是示例代码,此处还有一个链接 - https://3v4l.org/HdMtA

简而言之,预期的输出应该是。

document.addEventListener("visibilitychange", function() {
  audio.pause();
});

我只得到一个结果。

key 11111111 id val_somevalue5555

key 2222222  id val_somevalue25

key 11111111 id val_somevalue5555

任何帮助将不胜感激,不确定它的格式是json还是什么。

5 个答案:

答案 0 :(得分:1)

你正在尝试错误的事情。

使用print_r()查看已解码数组的内容,向我们显示您要迭代的内容是 - 实际上 - 包装在另一个数组中。

print_r($jsonarr)会返回此信息:

Array
(
    [0] => Array
        (
            [11111111] => Array
                (
                    [id] => val_somevalue5555
                    [customer] => Array
                        (
                            [32312] => Array
                                (
                                    [name] => jane doe
                                )

                        )

                )

            [2222222] => Array
                (
                    [id] => val_somevalue25
                    [customer] => Array
                        (
                            [32312234] => Array
                                (
                                    [name] => jane doe
                                )

                        )

                )

        )

)

所以,你所拥有的是一个包装在JSON数组中的JSON对象,其中所述对象是其中唯一的项目。

你想要:

a)在JSON的开头和结尾摆脱那些[]的东西,或者...... (如果你无法控制那个JSON)

b)迭代内部对象 (PHP将其表示为关联数组)

$jsonarr = json_decode($json, true);
$newarr = [];

foreach($jsonarr[0] as $key => $value) {
    $newarr[] = ['key' => $key, 'id' => $value['id']];
}`

var_dump($newarr);

看哪:https://3v4l.org/qCvRd

答案 1 :(得分:0)

更改循环以使用foreach循环本身的键:像这样

foreach($jsonarr as $key => $value)
{
   $newarr[] = ['key' => $key, 'id' => $value[$key]['id']]; //this seems off but what do I know.
}

PHP为Foreach使用数组的副本(或引用?),它可以产生一些意想不到的事情。它有时会做一些幽灵般的伏都教的东西,如果你曾尝试编辑阵列结构,同时在foreach中使用引用,例如foreach($var as $k => &$v )。我发誓有一次它像阵列中的幻影物品......哈哈

答案 2 :(得分:0)

您需要更改json结构,然后进行必要的更改,我在下面提到

$json = '{
    "11111111": {
        "id": "val_somevalue5555",
        "customer": {
            "32312": {
                "name": "john doe"
            }
        }
    },
    "2222222": {
        "id": "val_somevalue25",
        "customer": {
            "32312234": {
                "name": "jane doe"
            }
        }
    }
}';

$jsonarr = json_decode($json, true);

$newarr = [];

foreach($jsonarr as $key=> $value)
{

    $newarr[] = ['key' => $key, 'id' => $value['id']];
}
var_dump($newarr);

答案 3 :(得分:0)

添加另一个foreach来循环[0]的元素,如果你有更多这个元素。

foreach($jsonarr as $value)
{
    foreach($value as $key => $val){
        $newarr[] = ['key' => $key, 'id' => $val['id']];    
    }
}

<强>结果

array(2) {
  [0]=>
  array(2) {
    ["key"]=>
    int(11111111)
    ["id"]=>
    string(17) "val_somevalue5555"
  }
  [1]=>
  array(2) {
    ["key"]=>
    int(2222222)
    ["id"]=>
    string(15) "val_somevalue25"
  }
}

Test here

答案 4 :(得分:0)

你在看这个o / p:

$json = '[{
    "11111111": {
        "id": "val_somevalue5555",
        "customer": {
            "32312": {
                "name": "john doe"
            }
        }
    },
    "2222222": {
        "id": "val_somevalue25",
        "customer": {
            "32312234": {
                "name": "jane doe"
            }
        }
    }
}]';

$jsonarr = json_decode($json, true);

$newarr = [];

foreach($jsonarr[0] as $key => $value)
{
    //echo "<br />".$key = key($value);
    $newarr[] = ['key' => $key, 'id' => $value['id']];
}
var_dump($newarr);

输出:

array(2) {
  [0]=>
  array(2) {
    ["key"]=>
    int(11111111)
    ["id"]=>
    string(17) "val_somevalue5555"
  }
  [1]=>
  array(2) {
    ["key"]=>
    int(2222222)
    ["id"]=>
    string(15) "val_somevalue25"
  }
}

或者你可以改变json结构,因为ankit说道并遵循他的代码......