相同的json数组删除过程为不同的值位置生成不同的结果数组

时间:2016-09-08 08:05:25

标签: php arrays json

我有一个json数组。其中我有3个值。当我删除第一个或第二个值时,删除后的结果数组是一种格式。但是当我删除最后一个值时,结果数组总是会改变。我通过将数组转换回字符串来回显数组。

当我删除除最后一个之外的任何值,即第一个或第二个或任何其他值

  

result = {“1”:{“name”:“cat”},“2”:{“name”:“elephant”}}

这里我删除了第一个值 - 狗

$animals = '{
 "0":{"name":"dog"},
 "1":{"name":"cat"},
 "2":{"name":"elephant"}
 }';
$animals = json_decode($animals, true);
$del_value = "elephant";
$loginArray = array('name' => $del_value);
if (in_array($loginArray, $animals)) {
    foreach ($animals as $key => $value) {
        if (in_array($del_value, $value)) {
            unset($animals[$key]);
        }
    }
}
$animals_string = json_encode($animals);
echo $animals_string;

但是当我删除最后一个值时,它会创建不同的格式

  

result = [{“name”:“dog”},{“name”:“cat”}]

这里我删除了最后一个值 - elephant

$animals = '{
 "0":{"name":"dog"},
 "1":{"name":"cat"},
 "2":{"name":"elephant"}
 }';
$animals = json_decode($animals, true);
$del_value = "elephant";
$loginArray = array('name' => $del_value);
if (in_array($loginArray, $animals)) {
    foreach ($animals as $key => $value) {
        if (in_array($del_value, $value)) {
            unset($animals[$key]);
        }
    }
}
$animals_string = json_encode($animals);
echo $animals_string;

1 个答案:

答案 0 :(得分:1)

此行为是预期的。

PHP支持2种类型的数组:

  1. 关联:索引可以是字符串或非连续整数
  2. 数字索引:索引是从0开始的连续整数
  3. 然而,JSON仅支持第二种类型的数组,因此当您将关联数组转换为JSON时,您将获得一个对象。

    示例:

    print_r(json_encode([ 1,2,3,4 ])); //Prints [1,2,3,4]
    print_r(json_encode([ 0=> 1, 1=>2, 2=>3, 3=>4 ])); //also prints [1,2,3,4]
    print_r(json_encode([ "a" => 1, "b" => 2 ])); //Prints {"a":1,"b":2}
    print_r(json_encode([ 1 => "a" , 2 => "b" ])); //Prints {"1":"a","2":"b"}
    

    通过删除原始密钥强制PHP数组(任何类型)到JSON数组:

    $animals_string = json_encode(array_values($animals)); //Will always have form : [{"name": "X" },{"name":"Y"}]
    

    强制PHP数组(任何类型)到JSON对象:

    $animals_string = json_encode((object)$animals); //Will always have form : {"i1":{"name":"X"},"i2":{"name":"Y"}}
    

    在您的特定情况下的问题是您的JSON对象被转换为PHP数字索引数组,当编码回来时它变成JSON数组:

    $animals = '{
       "0":{"name":"dog"},
       "1":{"name":"cat"},
       "2":{"name":"elephant"}
     }';
    $animals = json_decode($animals, true);
    
    echo json_encode($animals); 
    

    回声

      

    [{ “名称”: “狗”},{ “名称”: “猫”},{ “名称”: “大象”}]

    如果删除除last之外的其中一个索引,则会使PHP数组关联,并将其转换为JSON对象。

    这就是PHP的工作方式如果你想要一个不同的输出,你需要明确它,如下所示:

    $animals = '{
     "0":{"name":"dog"},
     "1":{"name":"cat"},
     "2":{"name":"elephant"}
     }';
    $animals = json_decode($animals, true);
    $del_value = "elephant";
    $loginArray = array('name' => $del_value);
    if (in_array($loginArray, $animals)) {
        foreach ($animals as $key => $value) {
            if (in_array($del_value, $value)) {
                unset($animals[$key]);
            }
        }
    }
    $animals_string = json_encode((object)$animals);
    echo $animals_string;  //Always the same format
    

    我希望这会有所帮助。