在JavaScript中循环通过json_encoded PHP数组

时间:2014-07-14 18:15:22

标签: javascript php jquery

我遇到了循环遍历从PHP传递给Ajax请求的数组的问题。

出于某种原因,我的javascript认为每个字符都是数组的一部分,或者我的响应变量只是作为字符串传递。

这是我的javascript:

<script>        
    $(function() {
        $.ajax({
            url: "/dev/editButton/get_names.php",
            success: function(response) {
                console.log(response);
            }
        });
    });
</script>

这是我的PHP:

<?php
include '../portfolio/libraries/settings.php';

$connect = mysqli_connect($HOST, $DB_USER, $DB_PASS, $DATABASE);
$query = "SELECT * FROM AUTH_User";
$result = mysqli_query($connect, $query);

$names = array(); 

while ($row = mysqli_fetch_array($result)) {
    array_push($names, $row['FirstName']." ".$row['LastName']);
}

echo json_encode($names);
?>

我得到的回应如下:

["Test Person","Test2 Person"]

但是,如果我使用javascript循环浏览或只打印出response[0],我会将每个字符作为数组的一部分。第一个元素是[,其次是"等。

我希望Test Person成为一个元素而Test2 Person成为另一个元素。

有人知道我做错了什么吗?谢谢!

5 个答案:

答案 0 :(得分:3)

您需要在响应中使用JSON.parse。如果不调用该函数,您只需获取JavaScript字符串中的字符索引。

 var resultArray = JSON.parse(response);
 resultArray[0];   //Should Be "test Person"

答案 1 :(得分:2)

根据响应的.ajax标头解释Content-Type方法的结果。如果它不正确或未指定,response变量将包含原始json代码作为字符串。

因此,一个解决方案是通过添加以下行来更改PHP代码:

header("Content-Type: text/json");

Docs

  

默认情况下,预处理的类型取决于Content-Type   响应,但可以使用dataType选项显式设置。如果   提供了dataType选项,Content-Type标头   回应将被忽视。

您可以将该文本解析为对象,或者您可以通过在调用中指定数据类型让JQuery为您执行此操作。然后response参数将保存对象而不是原始json字符串。

Docs

  

如果指定了json,则使用jQuery.parseJSON解析响应   在作为对象传递给成功处理程序之前。解析了   JSON对象通过的responseJSON属性可用   jqXHR对象。

$(function() {
    $.ajax({
        url: "/dev/editButton/get_names.php",
        datatype: "json",
        success: function(response) {
            console.log(response);
        }
    });
});

答案 2 :(得分:1)

在这种特殊情况下,您可以使用

        success: function(response) {
            response = eval(response);
            console.log(response);
        }

但这是不好的做法。

这里最好的解决方案是修改你的ajax调用,如下所示:

   $(function() {
    $.ajax({
        url: "/dev/editButton/get_names.php",
        datatype: 'json',
        success: function(response) {
            console.log(response);
        }
    });
});

指定的数据类型将请求返回的数据为json,jquery将自动将其解析为javascript对象。

答案 3 :(得分:0)

您必须将JSON解析为数组。您可以使用以下代码执行此操作:

var arr = $.parseJSON(response);

现在arr [0]应该是“测试人”。

答案 4 :(得分:0)

你可以用这种方式做到这一点,或者这样:

首先,您需要为AJAX指定返回类型。

$(function() {
    $.ajax({
        url: "/dev/editButton/get_names.php",
        dataType: "json",
        success: function(response) {
            console.log(response);
        }
    });
});

或者,你可以这样做:

$(function() {
    $.getJSON("/dev/editButton/get_names.php", function(response) {
        console.log(response);
    });
});

为此,您需要在PHP中相应地指定HTML标头:

<?php
include '../portfolio/libraries/settings.php';

$connect = mysqli_connect($HOST, $DB_USER, $DB_PASS, $DATABASE);
$query = "SELECT * FROM AUTH_User";
$result = mysqli_query($connect, $query);

$names = array(); 

while ($row = mysqli_fetch_array($result)) {
    array_push($names, $row['FirstName']." ".$row['LastName']);
}

header("Content-Type: application/json");
echo json_encode($names);
exit();
?>

exit();只是为了安全,所以你不会破坏有效的JSON格式。

JSON代表JavaScript Object Notation,因此您不必在那里做任何复杂的事情。这是一个简单的循环,例如:

for(var i in response) {
    console.log(response[i]);
}

或者,如果响应不是数组而是具有属性的对象,则可以通过首先获取正确的键来遍历对象属性:

var objKeys = Object.keys(response);
for(var i in objKeys) {
    var key = objKeys[i];
    console.log(response[key]);
}

我希望这有帮助!