在 foreach 循环中未设置将数组转换为关联数组

Posted

技术标签:

【中文标题】在 foreach 循环中未设置将数组转换为关联数组【英文标题】:Unset in foreach loop turns array into associative array 【发布时间】:2020-07-04 22:11:02 【问题描述】:

我使用以下代码有条件地从数组中删除项目:

$fruits = ['apple', 'orange', 'melon', 'banana', 'pineapple'];

echo json_encode($fruits) ."<br>";

foreach ($fruits as $key=>$fruit) 
    if (in_array($fruit, ['apple', 'orange', 'melon', 'banana'])) 
        unset($fruits[$key]);
    


echo json_encode($fruits) ."<br>";

现在的问题是未设置将数组更改为关联数组。我应该如何在不引起这种情况的情况下删除项目?

输出:

["apple","orange","melon","banana","pineapple"]
"4":"pineapple"

【问题讨论】:

我认为没有任何改变,您只是在数组中创建了一个孔,因此显示函数现在显式打印出索引,因为有些索引丢失了。 【参考方案1】:

您的问题是,每当json_encode 找到一个没有从 0 开始的连续数字键的数组时,它必须将其表示为一个带有数字键的对象,以便在 javascript 中获得该数组的准确表示(参见示例 # 4 在manual page)。您可以通过 array_values 运行数组以将其重新索引为 0 来解决此问题。例如:

$array = array('a', 'b', 'c');
echo json_encode($array, JSON_PRETTY_PRINT) . "\n";
unset($array[1]);
echo json_encode($array, JSON_PRETTY_PRINT) . "\n";
$array = array_values($array);
echo json_encode($array, JSON_PRETTY_PRINT) . "\n";

输出:

[
    "a",
    "b",
    "c"
]

    "0": "a",
    "2": "c"

[
    "a",
    "c"
]

在您的情况下,在 foreach 循环之后,您将使用

$fruits = array_values($fruits);

重置该数组中的索引。

Demo on 3v4l.org

【讨论】:

以上是关于在 foreach 循环中未设置将数组转换为关联数组的主要内容,如果未能解决你的问题,请参考以下文章

使用 PHP 中的 foreach 循环将数组值转换为单个数组

bash中通过关联数组的foreach循环仅返回最后一个元素

PHP-将对象转换为关联数组

Laravel 资源将我的关联数组转换为标准数组

PHP运用foreach神奇的转换数组(实例讲解)

将十进制数转换为二进制数----不用数组,也不用函数,只用循环