PHP:从2D阵列删除阵列

时间:2019-03-14 19:34:07

标签: php arrays unset array-unset

我正在上载一个包含10列的CSV文件/报告,但是在CSV文件的末尾有几行仅提供有关报告的详细信息,例如

  

生成者:XXX

     

公司名称

     

报告运行@ 2019-03-14

当我加载数组时,键只是数字(从0到9),但是我想使其成为基于列标题的关联数组。不幸的是,这不适用于最后几行,因为数组尺寸不同(1 vs 10)

这是我的代码:

$csv = array_map('str_getcsv', file($_FILES['file']['tmp_name']));
array_walk($csv, function(&$a) use ($csv) {
    if(count($csv[0]) != count($a)) {
        $a = null; // Remove the array
    } else {
        $a = array_combine($csv[0], $a); 
    }
});
array_shift($csv); # remove column header

当我执行$a = null;时,它会通过将其替换为NULL来“删除”。当我遍历数组时,我会执行if(is_null($row)) continue;来忽略NULL元素。有没有一种方法可以删除数组?

2 个答案:

答案 0 :(得分:2)

我认为没有array_walk会更直接。 array_walk只是将函数应用于数组的每个成员。将其设置为null并不意味着它消失了,正如您所见,它只是具有null值。如果您真的希望它消失,则需要取消设置。只需按键引用$csv,然后取消设置不需要的内容即可。

$keys = array_shift($csv);
$expected_count = count($keys);
foreach ($csv as $index => $values) {
    if (count($values) == $expected_count) {
        $csv[$index] = array_combine($keys, $values);
    } else {
        unset($csv[$index]);
    }
}

答案 1 :(得分:0)

Array_filter($ csv);然后会从您的数组中删除所有null / false / 0。

因此编写自定义函数以仅删除null可能更聪明。