You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PHP foreach循环中如何固定$country值直至检测到下一次变更?

问题描述

我有一份CSV数据,希望将其转换为如下结构的数组:

Array
(
    [0] => Array
        (
            [code] => PRODUCTID1
            [name] => HONDA
            [country] => JAPANESE
        )

    [1] => Array
        (
            [code] => PRODUCTID2
            [name] => TOYOTA
            [country] => JAPANESE
        )

    [2] => Array
        (
            [code] => PRODUCTID3
            [name] => NISSAN
            [country] => JAPANESE
        )

    [3] => Array
        (
            [code] => PRODUCTID4
            [name] => BMW
            [country] => GERMAN
        )

    [4] => Array
        (
            [code] => PRODUCTID5
            [name] => AUDI
            [country] => GERMAN
        )

    [5] => Array
        (
            [code] => PRODUCTID6
            [name] => MERCEDES
            [country] => GERMAN
        )
)

现在需要设置$country变量,让它在每次变更前保持一致,应用到对应行的数据中。但直接把以下判断逻辑放进foreach循环里不行,因为每一行都会重新设置值:

if (strpos(strtolower(trim($value[1])), 'japanese') === true) {
    $country = 'japanese';
}
elseif (strpos(strtolower(trim($value[1])), 'german') === true) {
    $country = 'german';
}

我的现有代码如下:

function csv_content_parser($content) {
  foreach (explode("\n", $content) as $line) {
    yield str_getcsv($line, ",");
  }
}

$content = file_get_contents('cars.csv');

// Create one array from csv file's lines.
$data = array();
foreach (csv_content_parser($content) as $fields) {
  array_push($data, $fields);
}

$naujas_array = array();

foreach ($data as $key => $value) {

    if (!empty($value[0])) {
            $naujas_array[] =  array(
            'code'              => $value[0], 
            'name'              => $value[1], 
            'country'           => $country);
    }   
}
print_r($naujas_array);
解决方案

核心逻辑是仅在识别到分类标识行(含JAPANESE/GERMAN的行)时更新$country,产品行直接沿用当前的$country值。

修改后的代码如下:

function csv_content_parser($content) {
  foreach (explode("\n", $content) as $line) {
    yield str_getcsv($line, ",");
  }
}

$content = file_get_contents('cars.csv');

$data = array();
foreach (csv_content_parser($content) as $fields) {
  array_push($data, $fields);
}

$naujas_array = array();
// 初始化country变量,避免未定义报错
$country = '';

foreach ($data as $key => $value) {
    $trimmedName = strtolower(trim($value[1] ?? ''));
    
    // 优先判断当前行是否为分类标识行,是则更新country
    if (strpos($trimmedName, 'japanese') !== false) {
        $country = 'JAPANESE';
    } elseif (strpos($trimmedName, 'german') !== false) {
        $country = 'GERMAN';
    } 
    // 若为产品行(有code值),则沿用当前country加入结果数组
    elseif (!empty($value[0])) {
        $naujas_array[] = [
            'code'    => $value[0], 
            'name'    => $value[1], 
            'country' => $country
        ];
    }
}

print_r($naujas_array);

关键修改说明:

  • 提前初始化$country变量,避免未定义变量报错
  • 循环内先检查分类标识行,仅这类行触发$country更新
  • 产品行不修改$country,直接使用当前已设置的分类值
  • 修正strpos判断逻辑:strpos返回匹配位置(数字)或false,不能用=== true,需用!== false判断是否匹配

这样就能保证同一分类下的所有产品行,都会沿用该分类对应的$country值,直到遇到下一个分类标识行才更新。

内容的提问来源于stack exchange,提问作者DadaB

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.10 02:50:21