PHP 动态过滤 CSV 行中值为 0 的列并保留对应表头-php教程

本文介绍如何在 php 中根据匹配条件筛选 csv 数据后,**动态识别并移除每行中值为 0 的数值列(如鞋码库存)**,同时同步精简表头,实现“按行定制化列结构”的灵活处理。

在实际业务场景中(例如鞋类库存导出),CSV 文件常包含大量尺寸列(如 31–38),但不同商品仅在部分尺码有库存。若直接导出全部列,会带来冗余和可读性问题。理想的处理方式是:对每一匹配行,仅保留库存 > 0 的尺寸列,并动态生成对应的精简表头与数据行。

上述需求可通过 array_combine() + array_filter() 组合高效实现。关键在于:将表头($keys)与当前数据行($line)配对成关联数组,再利用 array_filter() 默认行为(过滤掉 0、””、null、false 等 falsy 值)剔除库存为 0 的项——这正是本方案的核心逻辑。

以下是优化后的完整代码段(含健壮性增强):

$csvContent = file_get_contents($_SERVER['DOCUMENT_ROOT'] . '/CsvTest/Sortiment.csv');
$input = 'Company';
$value = 'Dockers';

// 解析 CSV:按行分割 → 拆分为 CSV 数组
$rows = array_map('str_getcsv', explode(PHP_EOL, trim($csvContent)));
if (empty($rows)) {
    throw new RuntimeException('CSV is empty or malformed.');
}

$keys = array_shift($rows); // 提取表头
$keyIndex = array_search($input, $keys);
if ($keyIndex === false) {
    throw new InvalidArgumentException("Column '{$input}' not found in CSV header.");
}

$sortiment_array = [];
foreach ($rows as $line) {
    // 跳过空行或无效行
    if (!is_array($line) || count($line) !== count($keys)) continue;

    if (isset($line[$keyIndex]) && $line[$keyIndex] === $value) {
        // 关键步骤:用表头与数据行构建关联数组,并过滤掉值为 0(及其它 falsy)的项
        $combined = array_combine($keys, $line);
        // 注意:array_filter 会保留键名,且默认过滤 falsy 值(0 会被移除)
        $filtered = array_filter($combined, function($v) {
            // 显式判断:只过滤严格等于字符串 "0" 或整数 0,避免误删 "0.5"、"001" 等
            return $v !== '0' && $v !== 0 && $v !== '';
        });

        $sortiment_array[] = [
            'shoe size' => implode(',', array_keys($filtered)),
            'sortiment' => implode(',', $filtered)
        ];
    }
}

✅ 输出效果示例(对应原始数据中两行 Dockers):

夏夕资源网专注于CMS网站模板,主流语言整站网站源码下载,网站建设相关教程分享,好用的软件素材整合下载,提供一站式便捷自助服务。
1. 本站所有资源来源于用户上传和网络,如有侵权请邮件联系站长!
2. 分享目的仅供大家学习和交流,您必须在下载后24小时内删除!
3. 不得使用于非法商业用途,不得违反国家法律。否则后果自负!
4. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解!
5. 如有链接无法下载、失效或广告,请联系管理员处理!
6. 本站资源售价只是赞助,收取费用仅维持本站的日常运营所需!
7. 如遇到加密压缩包,默认解压密码为"zy.lucklyus.top",如遇到无法解压的请联系管理员!
夏夕资源网-网站模板_免费源码_资源素材 » PHP 动态过滤 CSV 行中值为 0 的列并保留对应表头-php教程
在线时间:12:00 - 22:00
关注微信公众号:微信公众号
站长邮箱:[email protected]
  • 运营天数: 1392+
  • 资源总数: 47989+
  • 用户总数: 1+
  • 今日更新: 0+
  • 访问次数: 4000280+
  • 本周更新: 0+
  • 最后更新: 2026-03-16

本站指数

×
  • 运营天数: 1392+
  • 资源总数: 47989+
  • 用户总数: 1+
  • 今日更新: 0+
  • 访问次数: 4000280+
  • 本周更新: 0+
  • 最后更新: 2026-03-16