PHP 如何按关联数组值提取对应键并分组
关联数组按值分组提取对应键的实现方案
核心实现思路
你不需要在循环外通过array_count_values做多余的去重统计,只需要在遍历原关联数组时,把每个元素的键按照对应的值归入预先准备好的分组容器即可,全程无额外的重复遍历开销。
常规安全实现(推荐)
不直接生成零散的独立变量,而是用统一的多维数组承载分组结果,避免变量命名冲突、特殊值导致的报错问题,代码逻辑如下:
$products = array_combine($one_array_key, $second_array_values); // 初始化分组容器 $grouped_by_value = []; foreach ($products as $key => $value) { // 以原数组的值作为分组键,把对应原键追加到分组列表中 $grouped_by_value[$value][] = $key; }
运行后$grouped_by_value的结构为:
$grouped_by_value = [ "A" => ["arn1", "arn2", "arn3"], "B" => ["arn4", "arn5", "arn6"] ];
需要取对应值的键列表时,直接通过数组下标访问即可,例如取A组的键用$grouped_by_value['A'],取B组用$grouped_by_value['B']。
匹配预期输出的独立变量写法
如果你确实需要生成$A、$B这类和值同名的独立变量,可以在上面的分组结果基础上,通过extract()函数把多维数组拆解为独立变量:
// 紧接上面的分组代码 extract($grouped_by_value);
执行完成后,就会自动生成符合你预期的$A、$B变量,内容和示例完全一致。
注意:如果原数组的值存在特殊字符(比如含空格、数字开头、PHP关键字),会导致生成非法变量名引发报错,这种场景下不建议使用这种写法。
现有代码的修正与优化
- 变量拼写错误:你写的
array_count_values($product)中的$product未定义,正确变量名是$products,且这行代码本身属于多余步骤,按上面的循环逻辑可以直接省略。 - 如果坚持要沿用"先提取去重值再初始化数组"的思路,也可以实现,但要注意变量合法性风险,示例代码如下:
$products = array_combine($one_array_key, $second_array_values); $products_distinct_values = array_count_values($products); $distinct_value_list = array_keys($products_distinct_values); // 给每个去重值初始化空数组 foreach ($distinct_value_list as $value) { ${$value} = []; } // 遍历填充内容 foreach ($products as $key => $value) { ${$value}[] = $key; }
内容的提问来源于stack exchange,提问作者Tahir Musharraf
相关产品推荐
相关产品推荐

