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


unset array key if certain values are null

考虑到下面的数组,我如何取消设置键1到7都为null的子数组。我似乎无法在脑海中想象如何迭代,或者是否有一个函数已经可以处理它了。

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

只取至少有一个元素不是NULL 的项

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

更新如果听欺骗,做另一个版本的

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

CCD_ 2决定是保留该数组还是丢弃该数组;回调返回键17中的任何一个是否不为空(如果不为空,则保留,否则丢弃(,它通过reducerange(1, 7)中的键根据它们中的任何是否为!== null转换为布尔值来实现这一点。

如果数组格式不变:

foreach ( $x as &$val ) {
    $val = array_filter($val);
}

foreach通过引用在数组上迭代,array_filter在没有回调的情况下将消除"false"值

找到了一个相当粗糙的解决方案,但它可以

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