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

问题描述 投票:0回答:5

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

下面是示例代码,这里还有一个链接 - https://3v4l.org/HdMtA

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

key 11111111 id val_somevalue5555

key 2222222  id val_somevalue25

我只得到一个结果。

key 11111111 id val_somevalue5555

.

$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 $value)
{
    $key = key($value);
    $newarr[] = ['key' => $key, 'id' => $value[$key]['id']];
}
var_dump($newarr);

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

php laravel
5个回答
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


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 )。我发誓有一次它像阵列中的幻影物品......哈哈


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

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说道并遵循他的代码......


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

© www.soinside.com 2019 - 2024. All rights reserved.