亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

相同鍵的兩個數組值相減,并在php中得到匹配和不匹配值的結果

相同鍵的兩個數組值相減,并在php中得到匹配和不匹配值的結果

PHP
慕少森 2021-12-03 14:46:21
我有兩個數組,如 $a 和 $b。我想為相同的鍵從 $a 減去 $b 。我也想看到兩個數組的不匹配鍵和減法結果。只會減去匹配的鍵。是否可以不使用 foreach 循環?非強制要求必須無循環求解。但如果沒有循環就可能更好。示例數組在下面。$a=Array(    [1] => 4.00    [2] => 3.00    [3] => 8.00    [4] => 4.88    [5] => 7.88    [10] => 17.88)$b=Array(    [1] => 2.00    [3] => 4.00    [4] => 2.88    [7] => 5.00    [8] => 6.00    )我想要這樣的結果$result=array([1] => 2.00[2] => 3.00[3] => 4.00[4] => 2.00[5] => 7.88[7] => 5.00[8] => 6.00[10] => 17.88);我的代碼是:$res1=$res2=$res3=array();foreach( $a as $k1=>$v1 ){     foreach($b as $k2=>$v2){         if($k1==$k2){            $res1[$k1]=$v2-$v1;         }else{            $res2[$k2]=v2;            $res3[$k1]=v1;         }     }}$res[]=array_merge($res1,$res2,$res3);echo "<pre>"; print_r($res); echo "</pre>";但它沒有給出我想要的正確結果。
查看完整描述

3 回答

?
一只名叫tom的貓

TA貢獻1906條經驗 獲得超3個贊

正如評論中提到的,array_walk本質上仍然是一個循環,因為它迭代每個元素。我已經記錄了每一步的代碼,但基本思想是創建一個合并的數組,然后更改重復項的值。有更有效的方法來解決這個問題,但這說明了一種基本方法。


我還應該指出,因為這是使用array_walk匿名函數(閉包),我們必須傳入它需要的任何變量(... use (...))。如果你使用一個foreach循環(或for),你不會需要做到這一點,你可以訪問的$output,$first和$second直接。


https://3v4l.org/WD0t4#v7125


<?php


$first = [

    1 => 4.00,

    2 => 3.00,

    3 => 8.00,

    4 => 4.88,

    5 => 7.88,

    10 => 17.88

];


$second = [

    1 => 2.00,

    3 => 4.00,

    4 => 2.88,

    7 => 5.0,

    8 => 6.00

];


// Merge the 2 original arrays and preserve the keys

// https://stackoverflow.com/q/17462354/296555

// The duplicate items' value will be clobbered at this point but we don't care. We'll set them in the `array_walk` function.

$output = $first + $second;


// Create an array of the duplicates. We'll use these keys to calculate the difference.

$both = array_intersect_key($first, $second);


// Foreach element in the duplicates, calculate the difference.

// Notice that we're passing in `&$output` by reference so that we are modifying the underlying object and not just a copy of it.

array_walk($both, function($value, $key) use (&$output, $first, $second) {

    $output[$key] = $first[$key] - $second[$key];

});


// Finally, sort the final array by its keys.

ksort($output);


var_dump($output);


// Output

//array (size=8)

//  1 => float 2

//  2 => float 3

//  3 => float 4

//  4 => float 2

//  5 => float 7.88

//  7 => float 5

//  8 => float 6

//  10 => float 17.88

以及使用foreach循環的強制性精簡版本。


<?php


$first = [

    1 => 4.00,

    2 => 3.00,

    3 => 8.00,

    4 => 4.88,

    5 => 7.88,

    10 => 17.88

];


$second = [

    1 => 2.00,

    3 => 4.00,

    4 => 2.88,

    7 => 5.0,

    8 => 6.00

];


$output = $first + $second;

foreach (array_keys(array_intersect_key($first, $second)) as $key) {

    $output[$key] = $first[$key] - $second[$key];

}

ksort($output);


var_dump($output);


// Output

//array (size=8)

//  1 => float 2

//  2 => float 3

//  3 => float 4

//  4 => float 2

//  5 => float 7.88

//  7 => float 5

//  8 => float 6

//  10 => float 17.88


查看完整回答
反對 回復 2021-12-03
?
ABOUTYOU

TA貢獻1812條經驗 獲得超5個贊

你非常接近!


$count = count($a) + count($b);  // figure out how many times we need to loop - count total # of elements


for ( $key = 1; $key <= $count ; $key++ )

{

    if ( isset($a[$key]) && isset($b[$key]) )  $result[$key] = number_format(abs($a[$key] - $b[$key]), 2);

    elseif ( isset($a[$key]) ) $result[$key] = number_format($a[$key], 2);

    elseif ( isset($b[$key]) ) $result[$key] = number_format($b[$key], 2);

}

"number_format" 和 "abs" 函數只是為了使輸出看起來與您所說的完全一樣。


查看完整回答
反對 回復 2021-12-03
?
侃侃無極

TA貢獻2051條經驗 獲得超10個贊

請嘗試使用以下代碼。希望它會給你想要的輸出。


$res1=$res2=$res3=array();

    foreach( $a as $k1=>$v1 ){

        if(isset($b[$k1])){

            $res1[$k1]=$a[$k1]-$b[$k1];     

        }else{

            $res2[$k1]=$v1;     

        }   

    }


    $res3=array_diff_key($b, $a);

    $result = array_replace_recursive($res1,$res2,$res3);

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


查看完整回答
反對 回復 2021-12-03
  • 3 回答
  • 0 關注
  • 355 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號