【问题标题】:Valid foreach loop causing 500 Internal Server Error in valid Ajax request有效的 foreach 循环在有效的 Ajax 请求中导致 500 Internal Server Error
【发布时间】:2018-11-02 15:53:37
【问题描述】:

我有一个$products 数组:

$products = [

    1031 => [
        'id'    => '1031',
        'name'  => 'TR16',
        'price' => 98.75
    ],
    1032 => [
        'id'    => '1032',
        'name'  => 'TR16G',
        'price' => 148.75
    ]
];  

还有一个 $newItemIds 数组:

$newItemIds = [

    1031 => [
        'id'       => 1031,
        'quantity' => 4
    ],
    1032 => [
        'id'       => 1032,
        'quantity' => 2
    ]
];

我正在尝试遍历这些数组并修改$products 数组,使其包含quantity

我的循环如下所示:

foreach($products as &$product) {
    foreach($newItemIds as $key => $value) {
        if ($product['id'] == $value['id']) {
            $product['quantity'] = $value['quantity'];
        }
    }
}

在 phptester.net,它会打印这个结果(正是我想要的):

Array
(
    [1031] => Array
        (
            [id] => 1031
            [name] => TR16
            [price] => 98.75
            [quantity] => 4
        )

    [1032] => Array
        (
            [id] => 1032
            [name] => TR16G
            [price] => 148.75
            [quantity] => 2
        )

)

在循环之前,我成功地将echo json_encode($products) 回到$.ajax 并在控制台中查看。

0: {id: "1031", name: "TR16", price: "98.75"}
1: {id: "1032", name: "TR16G", price: "148.75"} 

$.ajax 请求正在运行。

但是,在循环之后,当我再次回显 $products 以查看修改后的数组 (echo json_encode($products)) 时,我收到了 500 (Internal Server Error)

Ajax 正在运行;循环正常工作,但出了点问题。

如果有人知道我可能做错了什么,我将不胜感激。

这是所有测试的代码:

<?php

$products = [

    1031 => [
        'id'    => '1031',
        'name'  => 'TR16',
        'price' => 98.75
    ],
    1032 => [
        'id'    => '1032',
        'name'  => 'TR16G',
        'price' => 148.75
    ]
];

$newItemIds = [

    1031 => [

        'id'       => 1031,
        'quantity' => 4
    ],
    1032 => [
        'id'       => 1032,
        'quantity' => 2
    ]
];  

foreach($products as &$product) {
    foreach($newItemIds as $key => $value) {
        if ($product['id'] == $value['id']) {
            $product['quantity'] = $value['quantity'];
        }
    }
}

echo '<pre>';
print_r($products);
echo '</pre>';

【问题讨论】:

  • sandbox.onlinephpfunctions.com/code/… ...从表面上看似乎工作正常。您是否错过了示例中的其他相关细节?顺便说一句,如果您检查您的 PHP 日志(如果有的话)或打开错误报告,您将能够看到 500 错误的确切原因 - 它可能是任何类型的崩溃,因此其上的 500 代码自己的信息不足以真正提供详细帮助,尤其是当您显示的代码似乎可以正常工作时。
  • 很可能是错字或缺少;
  • 但是,从语义的角度来看,编码两个单独的 json 对象并回显它们可能会混淆您的客户端代码,因为它会期望返回一个连贯的 json 对象/数组,而不是两个独立的数据。它不会被 JavaScript 解析。这不会导致 500 错误,但会导致浏览器出现 JS 错误。

标签: php ajax foreach


【解决方案1】:

array_replace_recursive() 怎么样

<?php

$products = [

    1031 => [
        'id'    => '1031',
        'name'  => 'TR16',
        'price' => 98.75
    ],
    1032 => [
        'id'    => '1032',
        'name'  => 'TR16G',
        'price' => 148.75
    ]
];  


$newItemIds = [

    1031 => [
        'id'       => 1031,
        'quantity' => 4
    ],
    1032 => [
        'id'       => 1032,
        'quantity' => 2
    ]
];

$products_with_quantity = array_replace_recursive($products, $newItemIds);
print_r($products_with_quantity);

演示: https://3v4l.org/YQQpF

【讨论】:

  • 感谢您的回复! 500 错误消失了。 $products 数组有四个对象,而不是将quantity 添加到两个对象中。 0: {id: "1031", name: "TR16", price: "98.75"} 1: {id: "1032", name: "TR16G", price: "148.75"} 1031: {id: "1031", quantity: "3"} 1032: {id: "1032", quantity: "2"}
  • 希望对您有所帮助:)
  • 如果确实有帮助,请接受答案,以便下一个遇到此问题的人可以查看这里
  • 确实有帮助。学习新功能总是很棒,而且定义似乎很准确。我仍然想了解为什么 foreach 循环会失败。
猜你喜欢
  • 2015-09-15
  • 1970-01-01
  • 1970-01-01
  • 2017-02-18
  • 2013-01-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-04-18
相关资源
最近更新 更多