PHP 数组 - 移除空值

10
如何循环遍历该数组并删除任何空值:
[28] => Array
    (
        [Ivory] => 
        [White] => 
    )

[29] => Array
    (
        [Ivory] => 
        [White] => 
    )

[30] => Array
    (
        [Ivory] => 
        [White] => 36
    )

[31] => Array
    (
        [White] => 24
    )

所以说,它将从30中删掉28、29和只有牙色的部分...

谢谢!

6个回答

39

我看到你已经有一个可行的解决方案,但为了好玩,使用 array_map 的方法:

$array = array_filter(array_map('array_filter', $array));

7
黑魔法确实很神奇!但是需要指出的是,这只适用于嵌套数组。对于普通数组,只需要使用 array_filter() 函数而无需回调函数。 - Matt K
2
这是有效的,因为“如果没有提供回调函数(给array_filter),则将删除等于FALSE的所有数组条目”(来自手册)。还有@MattK所说的。 - Paulo Pinto

4
我相信这会满足你的需求:
```html

我相信这会满足你的需求:

```
foreach( $array as $key => $value ) {
    if( is_array( $value ) ) {
        foreach( $value as $key2 => $value2 ) {
            if( empty( $value2 ) ) 
                unset( $array[ $key ][ $key2 ] );
        }
    }
    if( empty( $array[ $key ] ) )
        unset( $array[ $key ] );
}

它将循环遍历您的外部数组,进入其中包含的任何数组并删除其值为空的键。然后,一旦完成此操作,它将从外部数组中删除所有子值都为空的键。
请注意,它不适用于“通用”数组,只适用于您提供的(二维)数组。

1
另一种方法是使用 preg_grep
foreach($array as $key => $subarray) {
    $array[$key] = preg_grep('/^$/', $subarray, PREG_GREP_INVERT);
}

更新:忘记删除空数组了。可以将@Ryan's answer中展示的技巧应用于此处。


不错,我从未使用过 preg_grep。但是我不认为这会从数组中删除索引28和29,对吧? - Ryan
@Ryan:没错,不知怎么的我忘了这个;) 但是你已经提供了如何做到这一点的好答案了... - Felix Kling

0

对于任何想要清理一个简单数组或多维数组(嵌套深度未知的数组)的变量的人,这是我的建议解决方案: (它被创建为类中的静态函数,但也可以在类外部工作 -> 只需删除self::)

    public static function clean($Array, $Strict=true)
    {
        if( ! is_array($Array))
        {
            return $Array;
        }
        $cleaned = array ();

        foreach ($Array as $key => $value)
        {
            if($Strict)
            {
                if(!empty($value))
                {
                    $tmp = self::clean($value,$Strict);
                    if(!empty($tmp))
                    {
                        $cleaned[$key] = $tmp;
                    }
                }
            }//strict
            else
            {
                if(is_array($value))
                {
                    if(!empty($value))
                    {
                        $tmp = self::clean($value,$Strict);
                        if(!empty($tmp))
                        {
                            $cleaned[$key] = $tmp;
                        }
                    }
                }
                elseif(strlen($value) > 0)
                {
                    $tmp = self::clean($value,$Strict);
                    if(strlen($tmp) > 0)
                    {
                        $cleaned[$key] = $tmp;
                    }
                }
            }//not strict
        } //end foreach

        return $cleaned;
    }

希望能为某人节省时间 :) 干杯


-1

你可能需要稍微编辑下面的代码。

foreach ($arr as $key => $value) {
  if($value == "") {
     unset($value[$key]);
  }
}

嗯,似乎不起作用......我在if语句中放了一个die;但它似乎没有终止——也就是说它没有被匹配。 - christian.thomas
这样做行不通,因为$value将是一个数组;他想从内部和外部数组中删除值为空的空键。 - Ryan
是的,这只是一个简短的代码示例,用于展示循环、检查和取消设置。我正在编写功能代码,但你在我完成之前就发布了解决方案。 - Pim Reijersen

-1
//Check Array Remove Empty Key
$ixx=0; $ix=0;//Set Array First.
while(end(array_keys($a1))>=$ix){ //Check Last Key in Array
if($a1[$ix]!=""){ //Check Empty Key
    $ax[$ixx]=$a1[$ix];$ixx++; } //Remove Empty Key
$ix++;
}
//End Check Array Remove Empty Key

print_r($ax);//Print Array After remove Empty Key

1
这并没有真正回答问题,问题是涉及到嵌套数组(一个数组中包含多个数组)。 - femtoRgon

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