如何在PHP中从关联数组中删除具有空键的值?

13

我有一个看起来是空字符串的键,然而使用unset($array[""]);不能移除该键/值对。我没有看到其他函数能达到我想要的效果,所以我猜这不仅仅是调用一个函数就能解决的问题。

在print_r中该元素的行为[] => 1,这表明键是空字符串。

使用var_export,该元素被列为'' => 1

使用var_dump,该元素被列为[""]=>int(1)

到目前为止,我尝试过所有建议的删除方法,但都没有删除该元素。我尝试了unset($array[""])unset($array[''])unset($array[null]),但都没有成功。

6个回答

24
尝试使用unset($array[null]);。如果这行不通,使用var_export或者var_dump打印数组,因为这可以让你看到键的类型。使用var_export以PHP语法查看数据。请注意,var_export无法处理递归结构。

在某个地方,一个空值被转换成了空字符串。通过回到数组的最初源头并取消空值,我能够解决这个问题。 - Thomas Owens
2
使用TRUE作为键将被评估为整数1作为键。使用FALSE作为键将被评估为整数0作为键。 使用NULL作为键将被评估为空字符串。使用空字符串作为键将创建(或覆盖)一个具有空字符串及其值的键; - okalex
在我的情况下,我必须使用双引号。unset($array[""]); - Tomas Gonzalez
1
在PHP中,当""''为空时,它们是相同的。 - SOFe
@SOFe 真的!我甚至不记得为什么写那个了。但我想我只是想说:“一个空数组”。 - Tomas Gonzalez

2
尝试过:
$someList = Array('A' => 'Foo', 'B' => 'Bar', '' => 'Bah');
print_r($someList);
echo '<br/>';
unset($someList['A']);
print_r($someList);
echo '<br/>';
unset($someList['']);
print_r($someList);
echo '<br/>';

收到:

Array ( [A] => Foo [B] => Bar [] => Bah )
Array ( [B] => Bar [] => Bah )
Array ( [B] => Bar )

您应该分析密钥的来源...


1

不确定该告诉你什么。运行这个脚本。

<?php

$arr = array(
        false   => 1
    ,   true    => 2
    ,   null    => 3
    ,   'test'  => 4
//  ,   ''      => 5
);

print_r( $arr );

foreach ( $arr as $key => $value )
{
    var_dump( $key );
}

unset( $arr[''] );

print_r( $arr );

我得到以下输出。
Array
(
    [0] => 1
    [1] => 2
    [] => 3
    [test] => 4
)
int(0)
int(1)
string(0) ""
string(4) "test"
Array
(
    [0] => 1
    [1] => 2
    [test] => 4
)

看到了吗,“null”数组键被类型转换为空字符串了吗?

你确定你没有使用数组的副本吗?如果你在函数内部调用了unset(),那么有可能是这样。

这是在PHP 5.2.0上测试的。


哇,我之前没意识到 null 在作为数组键时会被转换为空字符串。这是非常奇怪的行为。unset($array[null]) 的效果就像 unset($array['']) 一样。 - Lemming

1

我猜它不是一个空字符串。尝试以下操作以查看结果:

foreach ($array as $index => $value) {
    echo $index;
    echo ' is ';
    echo gettype($index);
    echo "\n";
}

我正在对数组进行print_r操作,但它似乎是一个空字符串。 - Thomas Owens
一旦我得到一个可行的答案,我会点赞,因为这是一个好想法。但我不希望它看起来像我已经找到了一个可行的答案。 - Thomas Owens

1

尝试使用var_dump而不是print_r。这可能会更好地让你了解键的确切内容。


0
请发布您用于删除元素的代码以及该行代码之前和之后的检查器代码。
我想要的是像这样的东西:
var_export($array);
echo "\n";
unset($array[""]);
var_export($array);

请同时发布两个var_export行的完整输出。

我正在寻找像这样的东西:

array (
  '' => 1,
)
array (
)

我不确定(现在也是如此),你是否正确地检查了事情。不是针对你,但代码应该可以工作。它不能工作的事实表明我们的假设之一是不正确的。为了验证,我想看到未经审查、未缩写的完整代码,而不是摘要版本。 - Lemming

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接