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

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);
 }
}

问题分析与解决方案

原代码存在以下问题:

  1. 变量名错误:$rray1应为$array1,$compareArr未定义
  2. 逻辑错误:遍历array2时反复赋值$IsSelected,最终结果只保留最后一次判断,且判断对象错误
  3. 结构错误: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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.09 21:54:55