PHP中如何将class_3_main的mainSupplierIds映射到class_3_suppliers的supplierIds
对应赋值数组中同位置字段的问题解决
你遇到的问题是想把class_3_main数组里每个元素的mainSupplierIds值,对应赋值给class_3_suppliers数组里同位置元素的supplierIds字段,但之前的代码导致每个supplierIds都变成了包含所有值的数组——这是因为你错误地把提取后的整个数组直接赋值给了class_3_suppliers的supplierIds键,而不是逐个元素对应赋值。
错误原因分析
你之前的代码逻辑问题在于:
$result = array_map(create_function('$arr', 'return $arr["mainSupplierIds"];'), $class_3_main); $class_3_suppliers['supplierIds'] = $result;
array_map确实会把class_3_main中所有mainSupplierIds提取成一个数组,比如["23, 24, 32, 21, 39, 84, 23", "47, 11"]- 但你直接把这个数组赋值给
$class_3_suppliers['supplierIds'],相当于给整个class_3_suppliers数组新增了一个supplierIds键,而不是给数组里的每个子元素设置supplierIds,自然不符合预期。
正确实现方式
因为class_3_main和class_3_suppliers是按顺序一一对应的,我们可以通过索引遍历两个数组,逐个完成赋值:
方法1:普通foreach循环
// 先从原数组中取出需要操作的两个子数组 $class_3_main = $list[0]['class_3_main']; $class_3_suppliers = $list[0]['class_3_suppliers']; // 遍历每个索引,对应赋值(加判断避免索引越界) foreach ($class_3_main as $index => $mainItem) { if (isset($class_3_suppliers[$index])) { $class_3_suppliers[$index]['supplierIds'] = $mainItem['mainSupplierIds']; } } // 将更新后的suppliers数组放回原数组 $list[0]['class_3_suppliers'] = $class_3_suppliers;
方法2:函数式风格(array_walk)
如果你更喜欢函数式写法,可以用array_walk遍历class_3_suppliers,同时引入class_3_main获取对应值:
$class_3_main = $list[0]['class_3_main']; $class_3_suppliers = $list[0]['class_3_suppliers']; array_walk($class_3_suppliers, function(&$supplierItem, $index) use ($class_3_main) { if (isset($class_3_main[$index])) { $supplierItem['supplierIds'] = $class_3_main[$index]['mainSupplierIds']; } }); $list[0]['class_3_suppliers'] = $class_3_suppliers;
执行以上代码后,class_3_suppliers数组就会变成你预期的结果:
"class_3_suppliers":[ { "originalId":6927, "name":"USA Suppliers", "supplierIds":"23, 24, 32, 21, 39, 84, 23" }, { "tag_id":6928, "name":"UK Suppliers", "supplierIds":"47, 11" } ]
小提示:create_function在PHP 7.2及以上版本已被废弃,建议用匿名函数替代,比如你原来的array_map可以改成:
$result = array_map(function($arr) { return $arr["mainSupplierIds"]; }, $class_3_main);
内容的提问来源于stack exchange,提问作者jay dhawan
相关产品推荐
相关产品推荐

