在 foreach 中使用时的 PHP array_slice递增

PHP array_slice increment when used in foreach

提问人:lStoilov 提问时间:5/10/2021 最后编辑:lStoilov 更新时间:5/10/2021 访问量:76

问:

我正在尝试使用来遍历JSON对象,然后从中创建另一个JSON。但出于某种原因,每个循环都会增加前一个对象。 例如,如果我有这个 JSONarray_slice

{
  "message":[
     {"id":1},
     {"id":2}
  ]
}

我用来遍历并打印 id 键,结果将是array_slice

id 1
id 1, id 2

我希望它是

id 1
id 2

这是我的代码

$result = '{"message":[{"id":1},{"id":2}]}';

$array = json_decode($result, true);
$json_response = array();

foreach (array_slice($array['message'], 0, 10) as $slot) {
    $row_array['buttons'][] = array(
            'caption' => $slot['id'],
            );
    array_push($json_response, $row_array);
}

$final_json = [
        "elements" => $json_response
    ];

这是一个工作演示

演示

预期结果是

{
    "elements": [
        {
            "buttons": [
                {
                    "caption": 1
                }
            ]
        },
        {
            "buttons": [
                {
                    "caption": 2
                }
            ]
        }
    ]
}
php foreach 切片

评论

0赞 CBroe 5/10/2021
您能否举例说明您真正想要在这里获得的结果?我目前看不出这里应该有什么切片。
0赞 lStoilov 5/10/2021
切片的要点是,如果我有 20 个 id,我想限制结果,例如,我只想显示 10 个
0赞 Nigel Ren 5/10/2021
您不需要 in,因为这会继续将值添加到列表中。不确定删除它是否适合您。[]$row_array['buttons'][] =
0赞 AbraCadaver 5/10/2021
您想要多个密钥还是只想要一个密钥?buttons
1赞 vlad katz 5/10/2021
只需添加 $row_array['buttons'] = [];在 $row_array['buttons'][] = array(...

答:

2赞 Nigel Ren 5/10/2021 #1

当您在...

$row_array['buttons'][]

这只是将新项目添加到现有值(即您到目前为止添加的所有其他值)中。此外,正如您所拥有的那样,这提供了您需要的数组。因此,删除...[]= array()[]

 $row_array['buttons'] =  [['caption' => $slot['id']]];

值周围的额外 's 集提供了所需的额外嵌套级别。[]

这是你的沙盒给...

{
    "elements": [
        {
            "buttons": [
                {
                    "caption": 1
                }
            ]
        },
        {
            "buttons": [
                {
                    "caption": 2
                }
            ]
        }
    ]
}

评论

0赞 lStoilov 5/10/2021
快到了。burrons 应该是"buttons": [{"caption": 1 }]
0赞 lStoilov 5/10/2021
弗拉德·卡茨(Vlad Katz)已经给出了正确的答案-添加之前确实如此$row_array['buttons'] = [];$row_array['buttons'][] = array(...
1赞 vlad katz 5/10/2021 #2

在 php 中,变量可以在循环后存活,这意味着 $row_array 在第一次迭代后仍然有效,并且其中包含已添加的值。只需为 $row_array['buttons'] 添加数组初始化,或者无需将值添加到数组中,只需分配值即可。

第一个解决方案:

foreach (array_slice($array['message'], 0, 10) as $slot) {
    $row_array['buttons'] = [];
    $row_array['buttons'][] = array('caption' => $slot['id'],);
    array_push($json_response, $row_array);
}

第二种解决方案:

foreach (array_slice($array['message'], 0, 10) as $slot) {
    $row_array['buttons'] = [array('caption' => $slot['id'],)];
    array_push($json_response, $row_array);
}

评论

0赞 lStoilov 5/10/2021
谢谢。做到了!