如果某些值为null,则取消设置数组键

时间:2015-06-04 09:43:10

标签: php arrays

考虑下面的数组,如何取消设置具有空值的键1到7的子数组。我似乎无法在脑海中想象如何迭代它,或者是否有一个已经处理它的功能。

$x = array(
            (int) 1 => array(
                'name' => 'Platemaking',
                (int) 1 => null,
                (int) 2 => null,
                (int) 3 => null,
                (int) 4 => null,
                (int) 5 => null,
                (int) 6 => null,
                (int) 7 => null
            ),
            (int) 2 => array(
                'name' => 'Digital Printing',
                (int) 1 => null,
                (int) 2 => '40.0%',
                (int) 3 => null,
                (int) 4 => null,
                (int) 5 => null,
                (int) 6 => null,
                (int) 7 => null
            ),
        );
例如,$x在这种情况下应该只有一个元素,即子数组索引2

预期结果如下:

$x = array(
            (int) 2 => array(
                'name' => 'Digital Printing',
                (int) 1 => null,
                (int) 2 => '40.0%',
                (int) 3 => null,
                (int) 4 => null,
                (int) 5 => null,
                (int) 6 => null,
                (int) 7 => null
            ),
        );

4 个答案:

答案 0 :(得分:1)

仅获取至少一个元素不为NULL的项目

$result = array_filter($x, function($val) { unset($val['name']); return array_filter($val);});
print_r($result);

<强>更新 如果听deceze,请做另一个版本

$result = array_filter($x, function($val) { 
         return array_filter(array_intersect_key($val, array_flip(range(1,7))));});
print_r($result);

答案 1 :(得分:0)

$x = array_filter($x, function (array $sub) {
    return array_reduce(range(1, 7), function ($notEmpty, $i) use ($sub) {
        return $notEmpty || $sub[$i] !== null;
    });
});

array_filter决定保留阵列还是丢弃它;回调返回任何键17是否为空(如果不是空保持,否则丢弃),它通过reduce中的range(1, 7)键来执行此操作一个布尔值,取决于它们中的任何一个是!== null

答案 2 :(得分:-1)

如果你的数组格式没有改变:

ANo   | Code  |Type  | Date1  | EX_Date|Rd_Date |CPS | Tax 
______|_______| _____|______  |_ ______|_______ |____|__________
B1    |   AM  |  T   |4/1/2014|3/2/2012|4/2/2010| 99 | 1
B1    |   AM  |  T   |5/2/2014|3/5/2012|4/2/2010| 99 | 1

foreach迭代数组by referencearray_filter没有回调将消除&#34; falsey&#34;值

答案 3 :(得分:-1)

找到了一个相当粗糙的解决方案,但它确实有效

            $result = array();
            foreach ($tmp as $k => $v){
                $i = 0;
                if(!((empty($v[++$i]))&&(empty($v[++$i])) && (empty($v[++$i])) && (empty($v[++$i]))&&(empty($v[++$i])) && (empty($v[++$i])) &&
                    (empty($v[++$i])))){
                    $result[$k] = $v;
                }
            }
            return $result;