PHP:如何基于两个现有数组生成带选中标记的目标关联数组
PHP数组处理问题
现有两个来源不同的数组(一个为关联数组):
数组1(关联数组)
echo('<pre>'); var_dump(array1); echo('</pre>');
输出结果:
array(7) { [2375]=> array(3) { ["Val"]=> string(1) "x" ["Desc"]=> string(13) "Lorem ipsum 1" ["gr_id"]=> string(2) "33" } [2377]=> array(3) { ["Val"]=> string(1) "y" ["Desc"]=> string(13) "Lorem ipsum 2" ["gr_id"]=> string(2) "33" } [2379]=> array(3) { ["Val"]=> string(1) "z" ["Desc"]=> string(13) "Lorem ipsum 3" ["gr_id"]=> string(2) "33" } [2381]=> array(3) { ["Val"]=> string(1) "a" ["Desc"]=> string(13) "Lorem ipsum 4" ["gr_id"]=> string(2) "33" } [2383]=> array(3) { ["Val"]=> string(1) "b" ["Desc"]=> string(13) "Lorem ipsum 5" ["gr_id"]=> string(2) "33" } [3300]=> array(3) { ["Val"]=> string(1) "c" ["Desc"]=> string(13) "Lorem ipsum 5" ["gr_id"]=> string(2) "83" } [3302]=> array(3) { ["Val"]=> string(1) "d" ["Desc"]=> string(13) "Lorem ipsum 5" ["gr_id"]=> string(2) "83" } }
(注:原数组存在重复键名[2381],已修正为[2383]避免语法错误)
数组2
var_dump(array2);
输出结果:
array(2) { [0]=> string(1) "x" [1]=> string(1) "a" }
需求
生成名为array3的数组,要求:
- 包含
array1中gr_id等于33的所有Val值 - 为每个元素添加
Selected字段,标记该Val是否存在于array2中
预期结果:
echo('<pre>'); var_dump(array3); echo('</pre>');
输出结果:
array(5) { [0]=> array(2) { ["Val"]=> string(1) "x" ["Selected"]=> bool(true) } [1]=> array(2) { ["Val"]=> string(1) "y" ["Selected"]=> bool(false) } [2]=> array(2) { ["Val"]=> string(1) "z" ["Selected"]=> bool(false) } [3]=> array(2) { ["Val"]=> string(1) "a" ["Selected"]=> bool(true) } [4]=> array(2) { ["Val"]=> string(1) "b" ["Selected"]=> bool(false) } }
尝试的代码(未成功)
$array3 = array(); foreach($rray1 as $Key => $Values){ $tempArr = array(); if($Values['gr_id'] == $GrID){ foreach($array2 as $ValueSelected){ $IsSelected = in_array($ValueSelected, $compareArr); } $tempArr[$GrID] = array( 'Descr' => $Values['Val'], 'Selected' => $IsSelected ); array_push($array3 , $tempArr); } }
问题分析与解决方案
原代码存在以下问题:
- 变量名错误:
$rray1应为$array1,$compareArr未定义 - 逻辑错误:遍历
array2时反复赋值$IsSelected,最终结果只保留最后一次判断,且判断对象错误 - 结构错误:
tempArr使用$GrID作为键,导致array3元素嵌套层级不符合预期;字段名Descr应为Val
修正后的代码:
$array3 = []; $targetGrId = '33'; // 目标gr_id值 foreach ($array1 as $item) { // 筛选gr_id等于33的元素 if ($item['gr_id'] === $targetGrId) { // 判断当前Val是否在array2中 $isSelected = in_array($item['Val'], $array2); // 构造符合要求的元素并添加到array3 $array3[] = [ 'Val' => $item['Val'], 'Selected' => $isSelected ]; } } // 输出结果 echo('<pre>'); var_dump($array3); echo('</pre>');
优化建议
如果array2元素较多,可先将其转为键值对数组,提升查找效率:
$array2Keys = array_flip($array2); $array3 = []; $targetGrId = '33'; foreach ($array1 as $item) { if ($item['gr_id'] === $targetGrId) { // 使用isset判断,比in_array更高效 $isSelected = isset($array2Keys[$item['Val']]); $array3[] = [ 'Val' => $item['Val'], 'Selected' => $isSelected ]; } }
内容的提问来源于stack exchange,提问作者Andrea Zanetti
相关产品推荐
相关产品推荐

