【问题标题】:PHP array_slice increment when used in foreach在 foreach 中使用时 PHP array_slice 递增
【发布时间】:2026-02-05 06:30:01
【问题描述】:

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

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

我使用array_slice循环并打印id键,结果将是

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

这是一个工作演示

Demo

预期的结果是

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

【问题讨论】:

  • 您能否添加一个示例,说明您真正想要在这里得到什么结果?我目前看不到这里应该有什么 point 切片。
  • 切片的重点是,如果我有例如 20 个我只想显示 10 个的 id,我想限制结果
  • 您不需要[] 中的$row_array['buttons'][] = ,因为这会继续将值添加到列表中。不确定仅删除它是否对您有用。
  • 您想要多个buttons 键还是一个键?
  • 只需添加 $row_array['buttons'] = [];之前 $row_array['buttons'][] = array(...

标签: php foreach slice


【解决方案1】:

当您在...中添加项目时

$row_array['buttons'][]

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

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

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

这是你的沙盒给...

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

【讨论】:

  • 快到了。 burrons 应该是"buttons": [{"caption": 1 }]
  • vlad katz,已经给出了正确的答案 - 在 $row_array['buttons'][] = array(... 之前添加 $row_array['buttons'] = []; 成功了
【解决方案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);
}

【讨论】:

  • 谢谢。做到了!