Php 基于来自另一个数组的值替换数组中的值

Php 基于来自另一个数组的值替换数组中的值,php,arrays,laravel,optimization,laravel-5.1,Php,Arrays,Laravel,Optimization,Laravel 5.1,具有以下2个阵列: [ {"id":1,"value":40}, {"id":2,"value":30} ] 以及: 我最终想要的是以下结果: [ {"id":1,"value":20}, {"id":2,"value":10} ] 在这里,我想根据ìd`,用第二个数组中的值替换第一个数组中的值。我做了这样的东西: foreach ($array2 as $k => $v) { array_filter($array1), function($i

具有以下2个阵列:

[
    {"id":1,"value":40},
    {"id":2,"value":30}
]
以及:

我最终想要的是以下结果:

[
    {"id":1,"value":20},
    {"id":2,"value":10}
]
在这里,我想根据ìd`,用第二个数组中的值替换第一个数组中的值。我做了这样的东西:

foreach ($array2 as $k => $v) {
    array_filter($array1), function($item) use($value) {
        $item['id'] == $v['userId'] ? $item['value'] = $v['worth'] :$item['value'] = $item['value'];
    });
}
它适用于那些给定的阵列,但如果您的阵列具有超过100万个数据,则永远无法实现! 问题是,是否有一些PHP函数可以完成这项艰巨的工作

更新 数组格式已更新,现在我应该使用以下格式:

[
    0 => stdClass {"id":1,"value":40},
    1 => stdClass {"id":2,"value":30}
]
以及:

Var_转储的结果: 阵列1:

array (size=2)
  0 => 
    object(stdClass)[2721]
      public 'value' => float 84
      public 'id' => int 1229
  1 => 
    object(stdClass)[2707]
      public 'value' => float 144
      public 'id' => int 1712
阵列2:

array (size=2)
  0 => 
    object(Bank\Accounting\Statement)[2754]
      public 'worth' => float 572
      public 'userId' => int 1229
  1 => 
    object(Bank\Accounting\Statement)[2753]
      protected 'worth' => float 654
      protected 'userId' => int 1712

您可以使用
array\u列
userId
作为键,将
worth
作为值

使用
map
重复第一个数组。检查键是否存在,如果存在,则更换

$arr1 = [{"id":1,"value":40},{"id":2,"value":30}];
$arr2 = [{"userId":1,"worth":20},{"userId":2,"worth":10}];

//Use array_column to make the userId as the key and worth as the value.
$arr2 = array_column($arr2, 'worth', 'userId');


//Use `map` to reiterate the first array. Check if the key exist on $arr2, if exist replace the `value`. If not replace it with empty string.
$results = array_map( function($v) use ( $arr2 ) {
    $valueInArr2 = array_search($v->id, array_column($arr2, 'userId'));
    $v->value = $valueInArr2 ? $valueInArr2 : "";
    return $v;
}, $arr1);


echo "<pre>";
print_r( $results);
echo "</pre>";

更新:使用对象。我还没有测试过这个

$arr1 = '[{"id":1,"value":40},{"id":2,"value":30}]';
$arr2 = '[{"userId":1,"worth":20},{"userId":2,"worth":10}]';

$arr1 = json_decode($arr1, true);
$arr2 = json_decode($arr2, true);
$col2 = collect($arr2);

foreach ($arr1 as &$value) {
    $value['value'] = $col2->where('userId', $value['id'])->first()['worth'];
}
echo "<pre>";
print_r($arr1);

您可以使用
array\u列
userId
作为键,将
worth
作为值

使用
map
重复第一个数组。检查键是否存在,如果存在,则更换

$arr1 = [{"id":1,"value":40},{"id":2,"value":30}];
$arr2 = [{"userId":1,"worth":20},{"userId":2,"worth":10}];

//Use array_column to make the userId as the key and worth as the value.
$arr2 = array_column($arr2, 'worth', 'userId');


//Use `map` to reiterate the first array. Check if the key exist on $arr2, if exist replace the `value`. If not replace it with empty string.
$results = array_map( function($v) use ( $arr2 ) {
    $valueInArr2 = array_search($v->id, array_column($arr2, 'userId'));
    $v->value = $valueInArr2 ? $valueInArr2 : "";
    return $v;
}, $arr1);


echo "<pre>";
print_r( $results);
echo "</pre>";

更新:使用对象。我还没有测试过这个

$arr1 = '[{"id":1,"value":40},{"id":2,"value":30}]';
$arr2 = '[{"userId":1,"worth":20},{"userId":2,"worth":10}]';

$arr1 = json_decode($arr1, true);
$arr2 = json_decode($arr2, true);
$col2 = collect($arr2);

foreach ($arr1 as &$value) {
    $value['value'] = $col2->where('userId', $value['id'])->first()['worth'];
}
echo "<pre>";
print_r($arr1);
您可以这样尝试(使用laravel collection):

您可以这样尝试(使用laravel collection):



需要更多的信息吗。。你在用拉威尔吗。。我看到了laravel标签是的,我正在使用laravel 5.1,可以使用
array\u map
你能做到吗?这两个数组总是在同一个顺序上吗?@MickaelLeger这是我尝试过的,但我不需要更多信息。。你在用拉威尔吗。。我看到了laravel标签是的,我正在使用laravel 5.1可以使用
array\u map
你能做到吗?这两个数组的顺序总是一样的吗?@MickaelLeger这就是我尝试过的,但是我不能“array\u列返回空数组”你可以发布你如何使用
array\u列的内容吗?我制作:$array2=array\u列($array2,'worth','useId');似乎您的数组格式已更改。你能用
var\u dump
来代替那些数组和post值吗?@MosCH请检查array\u列返回一个空数组你可以发布你如何使用
array\u列的帖子吗?
?我制作:$array2=array\u列($array2,'worth','useId');似乎您的数组格式已更改。你能改为
var\u dump
那些数组和post值吗?@MosCH请检查+1,因为这是一个很好的解决方案,但我试图远离迭代所有数组,关于它的体积。+1,因为它是一个很好的解决方案,但是我试图远离迭代所有数组,关于它的体积。
$arr1 = .....;
$arr2 = .....;

//Make the object into array
$arr2 = array_reduce($arr2, function($c,$v) {
    $c[ $v->userId ] = array(
        'worth' => $v->worth;
        'userId' => $v->userId;
    );
    return $c;
},array());

//Update the first array
$results = array_map( function( $v ) use ( $arr2 ) {
    $val = array( 'id' => $v->id );
    $val['value'] = isset( $arr2[ $v->id ] ) ? $arr2[ $v->id ] : "";
    return $v;
}, $arr1);
$arr1 = '[{"id":1,"value":40},{"id":2,"value":30}]';
$arr2 = '[{"userId":1,"worth":20},{"userId":2,"worth":10}]';

$arr1 = json_decode($arr1, true);
$arr2 = json_decode($arr2, true);
$col2 = collect($arr2);

foreach ($arr1 as &$value) {
    $value['value'] = $col2->where('userId', $value['id'])->first()['worth'];
}
echo "<pre>";
print_r($arr1);
Array
(
[0] => Array
    (
        [id] => 1
        [value] => 20
    )

[1] => Array
    (
        [id] => 2
        [value] => 10
    )
)