【问题标题】:Same json array delete process produces different result array for different position of value相同的json数组删除过程为不同的值位置产生不同的结果数组
【发布时间】:2016-09-12 13:58:03
【问题描述】:

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

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

结果 = {"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;

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

结果 = [{"name":"dog"},{"name":"cat"}]

在这里我删除了最后一个值 - 大象

$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;

【问题讨论】:

  • 当你说不同的格式时,你的意思是它变成了一个数组而不是一个带有数字索引的对象?如果是这样,那是正常的。
  • 请检查一下,它不正常。当我删除第一个或第二个值时,它会以一种格式生成数组,但如果我删除最后一个值,它会生成另一种格式的数组。

标签: php arrays json


【解决方案1】:

这种行为是意料之中的。

PHP 支持 2 种数组:

  1. 关联:其中索引可以是字符串或非顺序整数
  2. 数字索引:索引是从 0 开始的连续整数

但是 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); 

回声

[{"name":"dog"},{"name":"cat"},{"name":"elephant"}]

如果您删除除最后一个以外的索引之一,那么这会使 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

我希望这会有所帮助。

【讨论】:

  • 你不明白..我对你所说的没有任何问题。我很感激你的帮助。谢谢你。但我的问题是,删除第一个/第二个值与删除最后一个值有什么关系,假设有 3 个值,我只删除第一个值,之后我有结果数组。好的。如果我从这 3 个值中删除第二个值。我得到了一个结果数组。在这两种情况下,结果数组的格式都相同。但是如果我删除最后一个值,结果数组是另一种格式。这不是我分别删除第一个、第二个、第三个值。都是不同的情况。
  • 我是说有区别——“(案例1)删除第一个或第二个或第三个或第n个值”与“(案例2)删除最后一个值”相比
  • @SurajRoy 我添加了更多信息。关键是当您执行json_decode($animals, true) 时,您正在将 JSON 对象转换为 PHP 数字索引数组。当您在数组的开头或中间取消设置某些内容时,这会使数组具有关联性,而在末尾取消设置某些内容会使其保持数字索引。
  • 所以,这就是问题所在......现在我明白了。所以,如果我在删除之前检查该值是否是最后一个值,那么我可以在删除过程中添加一些条件。那么,我如何检查该值是否是最后一个值?
  • if ($key == array_keys($animals)[count($animals)-1]) { /* its the last key */ }
猜你喜欢
  • 1970-01-01
  • 2015-01-30
  • 2021-04-11
  • 1970-01-01
  • 1970-01-01
  • 2019-06-16
  • 1970-01-01
  • 1970-01-01
  • 2017-05-11
相关资源
最近更新 更多