7

我有一个关联数组:$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']

谢谢

4

5 回答 5

9

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

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));
?>
于 2013-07-29T12:05:19.897 回答
6

在你的情况下,它可能更容易。我最近有同样的问题。只需使用

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

array_filter()从数组中删除bool 转换为 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'));
于 2020-01-14T22:23:13.070 回答
2

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

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


于 2020-04-28T11:15:08.977 回答
0

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

if(implode('',$csv_arr[$i])==''){
    unset($csv_arr[$i]);
}
于 2013-07-29T12:09:01.367 回答
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);

如果您希望这适用于更多嵌套的关联数组,您可以在递归函数中实现相同的功能。

谢谢,尼拉夫

于 2013-07-29T12:49:19.933 回答