PHP:从二维数组中删除数组

Posted

技术标签:

【中文标题】PHP:从二维数组中删除数组【英文标题】:PHP: Delete Array from 2D-Array 【发布时间】:2019-08-05 19:55:12 【问题描述】:

我正在上传一个包含 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 元素。有没有办法真正删除数组?

【问题讨论】:

***.com/questions/26377761/… 可能重复? 您可以使用array_filter() 不带回调来删除空元素。 您能否提供一个包含 5 行数据和所需 php 数组结果的示例 CSV? array_filter($csv) 实际上并没有删除空值 您可能会发现最直接的方法是循环读取文件并仅添加具有完整字段集的行。目前您正在加载文件并至少处理整个文件两次。 【参考方案1】:

我认为没有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]);
    

【讨论】:

我将此标记为解决方案,因为它解决了我的问题,但我最终做了if (count($values) != $expected_count) continue;,因为我意识到如果我可以跳过包含不正确列的行并继续在foreach内解析【参考方案2】:

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

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

【讨论】:

以上是关于PHP:从二维数组中删除数组的主要内容,如果未能解决你的问题,请参考以下文章

PHP中怎么从一个二维数组中随机取出一个值?

PHP从二维数组获取指定数据,组成新维二数组

如何从二维数组中删除重复项? [关闭]

PHP 把二维数组按下标拆分成一维数组

thinkPHP二维数组排序

从二维数组python中删除引号