对象数组json stringify和decode - 无法访问数据

时间:2018-02-13 22:28:44

标签: javascript php arrays json

我构建了一个对象数组,然后使用ajax进行字符串化和发送,问题是我无法遍历结果并获得所需的数据。

当我运行foreach循环时整个脚本doit.php崩溃但如果我只是回显一个随机字符串,它将发出警报并控制台记录该字符串。

的index.php

<script>
    function ajax(url, parameters, method, form = false, callback = false) {
        var ajax_http = new XMLHttpRequest();
        var ajax_parameters;

        ajax_http.open(method, url, true);
        if (form === false) {
            ajax_parameters = parameters;
            ajax_http.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
        } else {
            ajax_parameters = new FormData(form);
        }
        ajax_http.onreadystatechange = function () {
            if (ajax_http.readyState === 4 && ajax_http.status === 200) {
                if (callback) {
                    callback(ajax_http.responseText);
                } else {
                    return ajax_http.responseText;
                }
            }
        };
        ajax_http.send(ajax_parameters ? ajax_parameters : null);
    }

    var data = [];

    var obj = {id: 1, name: "christian"};
    data.push(obj);

    var obj = {id: 2, name: "frej"};
    data.push(obj);

    console.log(data);
    data = JSON.stringify(data);
    console.log(data);


    ajax("doit.php", "data=" + data, "POST", false, function (results) {

        alert(results);
        console.log(results);
    });

</script>

doit.php

$data = json_decode($_POST['data']);

$str = "";
foreach($data as $person){
    $str .= $person["name"];
}

echo "str = " . $str;

1 个答案:

答案 0 :(得分:3)

如果您只想访问单列数据并将对象/元素粘合在一起,则无需循环并使用连接。

我认为array_column()implode()看起来会更干净......

代码:(Demo

$data=[(object)['id'=>1,'name'=>'christian'],(object)['id'=>2,'name'=>'frej']];

echo implode(', ',array_column((array)$data,'name'));
//                             ^^^^^^^- cast as array if you are not using json_decode($data,true);

输出:

christian, frej

如果您使用$data = json_decode($_POST['data'],true);(我推荐它),那么您可以写:

echo implode(', ',array_column($data,'name'));