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
相关产品推荐
相关产品推荐

