【问题标题】:PHP: Delete Array from 2D-ArrayPHP:从二维数组中删除数组
【发布时间】: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 元素。有没有办法真正删除数组?

【问题讨论】:

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

标签: php arrays unset array-unset


【解决方案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 可能更聪明。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-03-31
    • 2011-04-11
    • 1970-01-01
    • 2012-01-21
    • 2015-06-08
    • 1970-01-01
    • 2016-01-03
    • 2017-11-06
    相关资源
    最近更新 更多