【问题标题】:how to create a json array with data from a foreach loop in php如何在php中使用来自foreach循环的数据创建一个json数组
【发布时间】:2021-10-25 09:28:58
【问题描述】:

我有一些看起来像这样的 json 文件:

{
    "id": "id_11-08-2021",
    "name": "John",
    "date": "11-08-2021",
    "day": "Wednesday",
    "starttime": "08:30",
    "endtime": "10:00",
    "hours": 1.5
}

要读取目录中的所有json 文件,我使用以下代码(process.php):

$files = glob('data/*.json'); // all json files in dir data
foreach($files as $file) {
    $objs[] = json_decode(file_get_contents($file),1); // all json objects in array             
}
$result = [];
foreach($objs as $key => $val) {
    $result['data'] = array(                                
                        'id' => $val['id'];
                        'date' => $val['date'];
                        'day' => $val['day'];
                        'starttime' => $val['starttime'];
                        'endime' => $val['endtime'];
                        'hours' => $val['hours']                                    
                        );
}
$result['name'] = $_POST['name'];
$result['status'] = 2;
echo json_encode($result); // send back data

我的 jquery ajax 看起来像这样:

$.ajax({
        type: "POST",
        url: "process.php",
        data: {
            name: name          
        },
        dataType: "json",
        success: function(response) {
            if(response.status == 2) { // check status of data
                $('tbody').html(response.data); // handle data from server; output data in tbody
                $('.name').html(response.name); // name from user
            }
        },
});

我没有收到来自 foreach 循环的数据。出了什么问题?

【问题讨论】:

  • 首先,你在每次循环迭代中覆盖$result['data'],应该是$result['data'] = ...

标签: php arrays json ajax foreach


【解决方案1】:

首先,您在循环中不断地覆盖您的结果。您需要在循环中的data 内创建一个新的数组元素。

$result = [];
foreach ($objs as $key => $val) {
    $result['data'][] = array(                                
        'id' => $val['id'];
        'date' => $val['date'];
        'day' => $val['day'];
        'starttime' => $val['starttime'];
        'endime' => $val['endtime'];
        'hours' => $val['hours']                                    
    );
}
$result['name'] = $_POST['name'];
$result['status'] = 2;

其次,由于您没有更改循环中的任何内容,因此您可以使用 $objs 数组并删除循环。在您的示例中,循环不会执行任何操作。

$result['data'] = $objs;

【讨论】:

  • 最后一个例子是$result['data'][] = $objs;吗?
  • @ADyson 不,因为objs 已经是一个数组。 $result['data'] 在循环之后应该和你在做$result['data'] = $objs 一样。 $result['data'][] = $objs 会产生一个数组,如 data -> result -> 0 -> array of jsons
  • 如果你说在第一个例子中应该是$result['data'][] = array(,那么在第二个例子中应该是$result['data'][]。否则它不等效,每次运行foreach 循环时,您最终都会再次覆盖$result['data'] - 这是最初的问题。
  • @ADyson 不,因为第一个循环是用条目填充$result['data'] 数组的循环。 $result['data'][]data 键中创建一个新的数组条目。但是由于$objs 已经 一个数组,因此没有必要在结果中创建一个新的数组条目。因为$result['data'] = $objs; 行将替换循环。如果您执行循环$result['data'] = $objs; 行,您是正确的,但是您会复制数据。 $result['data'] = $objs; 行将替换循环。
  • @john 500 错误是服务器端错误,因此不能由 jQuery 直接导致。也许您的意思是导致 500 的请求是由 jQuery AJAX 请求触发的,还是什么?无论哪种方式,您都需要查看服务器的 PHP 错误日志以找到潜在的错误 - 500 代码本身并不能告诉我们太多信息。
猜你喜欢
  • 1970-01-01
  • 2018-03-30
  • 1970-01-01
  • 1970-01-01
  • 2013-08-20
  • 2020-05-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多