多维PHP数组到jQuery - 只看到一个结果

时间:2016-06-26 22:47:36

标签: php jquery multidimensional-array

我正在尝试使用PHP和jQuery来创建动态搜索结果页面。

PHP方面,调用SELECT语句,在其中检查是否已设置所有变量,添加我想要在客户端使用的HTML,然后将变量放在名为的数组中$result

在数据库调用的结果中,我还在他们自己的数组中添加longitudelatitude,名为$pins

然后我创建一个名为$results的多维数组,并将数组放在一起:

$result = array('listing'=>$listing);
$pins = array('lat'=>$lat1,'lng'=>$lon2); 
$results = array('listing'=>$result,'pins'=>$pins);

echo json_encode($results);


现在,客户端我使用jquery。我面临的问题是,总共应该有2个结果。但是我看到相同的结果重复两次(我可以确认它们应该是唯一的)。这是我的jQuery:

$.ajax({
    url: '/updatedsearch.php',
    type: 'POST',
    data: { 
        q: search, 
        lng: coordinates[0], 
        lat: coordinates[1], 
        },
                    dataType: "json",
                    success: function(data) {
                    if(data == "undefined" || data == null) {
                    console.log("There was no search results or something similar");
                                } else {
                                var pins = [data.pins.lat, data.pins.lng];
                                $.each(data, function(key, val) {
                                    $('#listings').append(data.listing.listing);
                                    console.log(pins);
                                    console.log(data);
                                });
                               }
                            },

此处的所有内容都可以正常运行,除了$.each()运行时,它似乎会将相同的数据附加两次。

我认为这是因为.append(data.listing.listing);,如果我理解正确,我没有在这里循环数组,我实际上是在引用data.listing.listing[0] - 我是否正确理解了这一点?

编辑:我现在遇到问题,我的结果出现了两次。应该只有两个结果,但总共有四个结果,似乎这些结果是重复的。

{"listing":["<div>This contains my HTML</div>"], "pins":"lat":"50.000000","lng":"-1.000000"}}

我已经运行了jsonlint,但它似乎无效。使用PHP我创建了以下数据:

while($listrow = mysqli_fetch_assoc($list)) {
$listing[] = '<div>This contains my HTML</div>';

}

$pins = array("lat"=>$lat1, "lng"=>$lon2);
$results = array('listing'=>$listing, 'pins'=>$pins);


echo json_encode($results);

我是否误解了使用多维数组,导致错误?

2 个答案:

答案 0 :(得分:1)

你没有循环遍历数组是对的。在追加时,您也没有引用单个数组项。

尝试:

$.each(data.listing.listing, function(i, item) {
    $('#listings').append(item);
});

执行以下操作时:

$.each(data, function(key, val) {

您正在遍历data对象的属性。它有两个属性:listingspins,因此循环执行两次。

对于循环的每次迭代,您将附加相同的值(data.listing.listing),我假设它是一个数组。

相反,我认为你想迭代数组,并在数组中附加每个项目。

编辑:您在问题顶部显示的PHP看起来像生成这样的JSON:

{
    "listing": { "listing": ["<div>This contains my HTML</div>"] },
    "pins": { "lat":"50.000000","lng":"-1.000000" }
}

但是通过编辑,您可以显示如下所示的JSON:

{
    "listing": ["<div>This contains my HTML</div>"],
    "pins": { "lat":"50.000000","lng":"-1.000000" }
}

如果这是您的JSON的样子,您应该使用:

$.each(data.listing, function(i, item) {

jsfiddle

答案 1 :(得分:1)

您似乎希望$.each遍历PHP中$results['listing']中的列表,但它实际上会遍历整个$results

为了更好地了解正在进行的操作,请为$.each中的当前项使用其他名称。因为您使用的data与用作success回调参数的名称相同,所以您需要更难调试代码。如果您想循环浏览商家信息,请在success回调中执行以下操作:

$.each(data.listing, function(i, result)){
   $('#listings').append(result);
}

您发布的JSON:

{
    "listing":["<div>This contains my HTML</div>"], 
    "pins":    "lat":"50.000000","lng":"-1.000000"}
}

无效,因为您错过了"pins":"lat"之间的左括号。它应该是

{
    "listing":["<div>This contains my HTML</div>"], 
    "pins":   {"lat":"50.000000","lng":"-1.000000"}
}