如何删除空关联数组条目

时间:2013-07-29 11:55:35

标签: php multidimensional-array associative-array

我有一个关联数组:$csv_arr

Array
(
    [0] => Array
        (
            [Enfalac] => alpha linolenic acid 300 mg
            [Enfapro] => alpha linolenic acid 200 mg
        )

    [1] => Array
        (
            [Enfalac] => arachidonic acid 170 mg
            [Enfapro] => 
        )

    [2] => Array
        (
            [Enfalac] => 
            [Enfapro] => 
        )

    [3] => Array
        (
            [Enfalac] => calcium 410 mg
            [Enfapro] => calcium 550 mg
        )
)

如何删除所有完全空的条目,例如$csv_arr[2],但保留部分条目,例如$csv_arr[1]

我已尝试$csv_arr = array_filter(array_map('array_filter', $csv_arr));,但这会删除空元素:$csv_arr[1]['Enfapro']

THX

5 个答案:

答案 0 :(得分:7)

试试这个,有点奇怪,但是:

array_filter($csv_arr, function($v){return array_filter($v) == array();});

完全未经测试,我不记得这是否适用于闭包,但它可以正常工作。

编辑(测试和工作):

<?php
$csv_arr = array(
    0 => array(
            'Enfalac' => 'alpha linolenic acid 300 mg',
            'Enfapro' => 'alpha linolenic acid 200 mg'
        ),

    1 =>  array(
            'Enfalac' => 'arachidonic acid 170 mg',
            'Enfapro' => ''
        ),

    2 =>  array(
            'Enfalac' => '',
            'Enfapro' => ''
        ),

    3 =>  array(

            'Enfalac' => 'calcium 410 mg',
            'Enfapro' => 'calcium 550 mg'
        )
);
$c = function($v){
    return array_filter($v) != array();
};
var_dump(array_filter($csv_arr, $c));
?>

答案 1 :(得分:3)

对于您来说,这可能会更容易。我最近有同样的问题。只需使用

$csv_arr = array_filter($csv_arr, 'array_filter');

array_filter()bool convert to false的数组中删除元素。例如,其中包括[], null, '', 0, false中的每一个。

功能

  1. 第一个array_filter()接受每个子数组,然后将其放入第二个array_filter()
  2. 第二个array_filter()删除每个false元素并返回其余元素。重要的是要注意,如果每个元素都转换为false,则返回的数组将为空。
  3. 第一个array_filter()取第二个结果,并与false进行比较。因此,万一返回一个空数组,子数组将从数组中删除。

为了证明这种情况,我以John V.为例,并使用了array_filter()行:

<?php
$csv_arr = array(
    0 => array(
            'Enfalac' => 'alpha linolenic acid 300 mg',
            'Enfapro' => 'alpha linolenic acid 200 mg'
        ),

    1 =>  array(
            'Enfalac' => 'arachidonic acid 170 mg',
            'Enfapro' => ''
        ),

    2 =>  array(
            'Enfalac' => '',
            'Enfapro' => ''
        ),

    3 =>  array(

            'Enfalac' => 'calcium 410 mg',
            'Enfapro' => 'calcium 550 mg'
        )
);
print_r(array_filter($csv_arr, 'array_filter'));

答案 2 :(得分:1)

这个示例已经过测试并且可以正常工作:

   $csv_arr = [
           0 => [
               'Enfalac' => 'alpha linolenic acid 300 mg',
               'Enfapro' => 'alpha linolenic acid 200 mg',
           ],

           1 => [
               'Enfalac' => 'arachidonic acid 170 mg',
               'Enfapro' => '',
           ],

           2 => [
               'Enfalac' => '',
               'Enfapro' => '',
           ],

           3 => [

               'Enfalac' => 'calcium 410 mg',
               'Enfapro' => 'calcium 550 mg',
           ],
       ];

       var_dump(array_filter(array_map('array_filter', $csv_arr)));


答案 3 :(得分:0)

好的,谢谢大家的帮助。我设法在循环中这样做。

if(implode('',$csv_arr[$i])==''){
    unset($csv_arr[$i]);
}

答案 4 :(得分:0)

我认为这是更好,更合适的解决方案,

这是代码:

$arr[0]['id'] = "id1";
$arr[0]['name'] = "testing";
$arr[1]['id'] = "id2";
$arr[1]['name'] = "another";
$arr[2]['id'] = "";
$arr[2]['name'] = "";
$d = array_keys($arr);
foreach($arr as $key=>$values){
    $a = array_keys($values);
    $n = count($a);
    for($i=0,$count=0;$i<$n;$i++){
        if($values[$a[$i]]==NULL){
            $count++;
        }
    }
    if($count==$n){

        unset($arr[$key]);
    }
}
echo "<pre>";
print_r($arr);

如果希望这对更多嵌套的关联数组有用,可以在递归函数中实现它。

谢谢, Nirav