PHP 遍历2个数组问题求指教,用B的值去填充A的值;

数组A:

$a = [
    0 => ['num' => 100],
    1 => ['num' => 105],
    3 => ['num' => 253],
    N.......
]

数组B:

$b = [
    0 => [
        'id' => 1,
        'num' => 300
    ],
    1 => [
        'id' => 2,
        'num' => 600
    ],
    2 => [
        'id' => 3,
        'num' => 900
    ],
    N........
]

疑问:我想要遍历出数组A里面num小于500的记录,然后用数组B里面的num去填充它,如果数组A里面的num已经等于500就跳过,最后还要有个数组来记录数组B中,那些ID参与了填充····,求指教下代码如何提现...貌似要递归?

阅读 2.8k
4 个回答

伪代码如下

// b 的索引
$index = 0
// b 参与填写 的数组
$contains = []
// for 循环 a
for ():
    if (a [i]>= 500) 
        continue
    else 
        a[i].num  = b[$index].num
        $contains.push(b[$index].id)
        $index++

不好意思,php 学过 但是忘记了,如果 b 可以随便填充a, 这样处理 就可以了
如果b 也要 大于 500 才能填充的话,你 直接 把 b 小于 500给处理掉就可以了

我也说个思路:

  1. array_filter把数组a里条件符合的筛出来
  2. 第一次array_replace,用数组b替换掉 [1] 里筛出来的值
  3. 第二次array_replace,用 [2] 替换掉数组a里的值
  4. 跑循环,用array_key_exists判断数组a里的每个数组元素是否存在名为'id'的key,如果存在就整条push到一个新数组里然后unset

可能不太优雅……就是多一种角度吧。

下面是按$a中的key$b中的id

<?php

$a = [
    0 => ['num' => 100],
    1 => ['num' => 105],
    3 => ['num' => 253],
];

$b = [
    0 => [
        'id' => 1,
        'num' => 300
    ],
    1 => [
        'id' => 2,
        'num' => 600
    ],
    2 => [
        'id' => 3,
        'num' => 900
    ],
];

$tmp = array_combine(array_column($b,'id'),array_column($b,'num'));
$ids = [];

array_walk($a, function(&$val,$key) use($tmp,&$ids){
    if($val['num'] < 500 && isset($tmp[$key])){
        $val['num'] = $tmp[$key];
        $ids[]      = $key;
    }
});

var_dump($a);
var_dump($ids);
 $a = collect($a)->map(function($a1, $key) use($b){
        if($a1['num'] < 500){
            $b1 = collect($b)->reject(function($b1) use($key){
               return $b1['id'] != $key;
            });
            $b1 = $b1->flatMap(function($xx){
                return $xx;
            });

            if (!empty($b1->toArray())){
                $a1['num'] = $b1['num'];
                $a1['index'] = $b1['id'];
                return $a1;
            }  
        }
    })->filter(function($v){
        return !empty($v);
    });

    dd($a);
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题