【问题标题】:Looping php array to json prints index value将php数组循环到json打印索引值
【发布时间】:2018-02-07 06:47:24
【问题描述】:

我一直在尝试遍历一个数组。将值插入两个单独的数组 $location 和 $name。但是 $name 数组也打印索引值, $location 工作正常。 这是一个代码示例

$j = 0;
foreach( $entities->results as $key => $value ) {

    if( stristr($value->vicinity, $key_stroke) ) {

        $location[$j]['place_id'] = $value->place_id;
        $location[$j]['vicinity'] = $value->vicinity;
    }

    if( stristr($value->name, $key_stroke) ) {

        $name[$j]['place_id'] = $value->place_id;
        $name[$j]['name'] = $value->name;
    }


 $j++; }

这是json输出

{
    "locations": [
        {
            "place_id": "ChIJRQqyYRFZWjcRmxKd0esyj-k",
            "vicinity": "GS Road, Christian Basti, Guwahati"
        },
        {
            "place_id": "ChIJG5IvxhNZWjcRlkMD6lCJ64c",
            "vicinity": "GS Road, Ananda Nagar, Christian Basti, Guwahati"
        },
        {
            "place_id": "ChIJxQp72BZZWjcR98oQbFrdTII",
            "vicinity": "GS Road, Christian Basti, Guwahati"
        },
        {
            "place_id": "ChIJm5eeJBBZWjcRksI_VY9u1Qo",
            "vicinity": "Zoo Road, Sundarpur, Guwahati"
        }
    ],
    "names": {
        "1": {
            "place_id": "ChIJG5IvxhNZWjcRlkMD6lCJ64c",
            "name": "Ayush Medico's"
        },
        "2": {
            "place_id": "ChIJxQp72BZZWjcR98oQbFrdTII",
            "name": "Premananda Medico's"
        },
        "3": {
            "place_id": "ChIJm5eeJBBZWjcRksI_VY9u1Qo",
            "name": "Asaan Medicos"
        }
    }
}

什么都试过了。可能是什么问题?

【问题讨论】:

  • 您的 if 语句 if( stristr($value->name, $key_stroke) ) 似乎在第一次迭代时返回 false,这使得它省略了 0 索引。当转换为 json 时,这会将“数组”变成一个对象,因为数组在索引中不能有任何间隙。
  • 合并结果时,使用array_values(),重置索引就可以了。
  • @LawrenceCherone 它起作用了,伙计..非常感谢....但我不知道它刚刚做了什么。介意解释一下吗??请
  • @MagnusEriksson 解释了它,文档解释了 array_values - 返回数组中的所有值并以数字方式索引数组。
  • @MagnusEriksson 非常感谢...

标签: php arrays json loops


【解决方案1】:

方案一:(不如下面的方案二高效)

$j = 0;
$i = 0; // change over here
foreach( $entities->results as $key => $value ) {

    if( stristr($value->vicinity, $key_stroke) ) {

        $location[$j]['place_id'] = $value->place_id;
        $location[$j]['vicinity'] = $value->vicinity;
        $j++;
    }

    if( stristr($value->name, $key_stroke) ) {

        $name[$i]['place_id'] = $value->place_id; // change over here
        $name[$i]['name'] = $value->name;         // change over here
        $i++;
    }

}

解决方案 2:

$name 数组传递给php 的内置函数array_values(),这反过来会返回从0 开始的数组索引。

【讨论】:

  • 如果第一个 if 条件是 false 对于某些 $value,第一个解决方案仍然将 $location 编码为 JSON 中的对象。
【解决方案2】:

如果您仔细观察,您会注意到在 JSON 中,"location" 的值是一个数组,而"names" 的值是一个对象(具有属性"1""2""3")。发生这种情况是因为 $location 是一个数组,其中包含与键 0123 关联的 4 值,而 $name 是一个其键为 1、@987654336 的数组@和3

因为 JSON 是 JavaScript 的子集,并且 JavaScript 数组只允许数字键(从 0 开始),PHP 只将具有从 0 开始的数字连续键的数组编码为 JavaScript 数组。所有其他数组都以 JSON 编码为对象。

这是写在documentation of json_encode():

注意:

编码数组时,如果键不是从0开始的连续数字序列,则所有键都编码为字符串,并为每个键值对显式指定。

$names 不包含键 0 的原因是包装了赋值的if 条件:

if( stristr($value->name, $key_stroke) ) {

包装$location[$j] 赋值的相似条件可以使$location 在不同的输入数据下表现相似。

如果您想在 JSON 编码的输出中获取数组,您必须以确保键是以0 开头的连续整数的方式构建它们。这比听起来容易。无需跟踪键,只需以不同的方式构建内部数组并让外部数组的 PHP generate the keys

$location = array();
$name     = array();

foreach( $entities->results as $key => $value ) {

    if( stristr($value->vicinity, $key_stroke) ) {

        $location[] = array(
           'place_id' => $value->place_id,
           'vicinity' => $value->vicinity,
        );
    }

    if( stristr($value->name, $key_stroke) ) {

        $name[] = array(
            'place_id' => $value->place_id,
            'name'     => $value->name,
        );
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-10-07
    • 1970-01-01
    • 1970-01-01
    • 2022-01-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多