第一次在segmentfault裡提問,現在遇到一個問題,非常希望能夠得到大家的解答,非常感謝!!!
問題是這樣的,現在有數組兩個$arr1 和 $arr2
$arr1 = ( array('num'=>'500',id=>'a1'), array('num'=>'300',id=>'a2'), array('num'=>'200',id=>'a3'));
$arr2 = ( array('num'=>'400',id=>'b1'), array('num'=>'200',id=>'b2'), array('num'=>'200',id=>'b3'), array('num'=>'100',id=>'b4'), array('num'=>'100',id=>'b5'));
兩個數組的索引值的總和相等,比如都是 1000, 所有的 num值 都是100的倍數,id值唯一,但兩個數組的長度都不固定;如何組合為一個這樣的數組
$arr = ( array(aid=>'a1',bid=>'b1','num'=>'400'), //b1結束 array(aid=>'a1',bid=>'b2','num'=>'100'),//a1的num值剩下的100 放到b2 a1結束 array(aid=>'a2',bid=>'b2','num'=>'100'),//b2 差的100從a2裡取 b2結束 array(aid=>'a2',bid=>'b3','num'=>'100'),//a2 剩下的200 放到b3 a2結束 b3結束 array(aid=>'a3',bid=>'b4','num'=>'100'),//a3 取100 給b4 b4結束 array(aid=>'a2',bid=>'b5','num'=>'100'),//a3 上下的100 給b5 b5結束 a3結束);
請忽視我的小白狀況,幫我看下這個問題,再次感激不盡!
回複內容:
第一次在segmentfault裡提問,現在遇到一個問題,非常希望能夠得到大家的解答,非常感謝!!!
問題是這樣的,現在有數組兩個$arr1 和 $arr2
$arr1 = ( array('num'=>'500',id=>'a1'), array('num'=>'300',id=>'a2'), array('num'=>'200',id=>'a3'));
$arr2 = ( array('num'=>'400',id=>'b1'), array('num'=>'200',id=>'b2'), array('num'=>'200',id=>'b3'), array('num'=>'100',id=>'b4'), array('num'=>'100',id=>'b5'));
兩個數組的索引值的總和相等,比如都是 1000, 所有的 num值 都是100的倍數,id值唯一,但兩個數組的長度都不固定;如何組合為一個這樣的數組
$arr = ( array(aid=>'a1',bid=>'b1','num'=>'400'), //b1結束 array(aid=>'a1',bid=>'b2','num'=>'100'),//a1的num值剩下的100 放到b2 a1結束 array(aid=>'a2',bid=>'b2','num'=>'100'),//b2 差的100從a2裡取 b2結束 array(aid=>'a2',bid=>'b3','num'=>'100'),//a2 剩下的200 放到b3 a2結束 b3結束 array(aid=>'a3',bid=>'b4','num'=>'100'),//a3 取100 給b4 b4結束 array(aid=>'a2',bid=>'b5','num'=>'100'),//a3 上下的100 給b5 b5結束 a3結束);
請忽視我的小白狀況,幫我看下這個問題,再次感激不盡!
這個題目我是這麼考慮的。把arr1和arr2想象成兩組水桶,$arr1
裡有3個水桶,分別裝著500, 300, 200的水,$arr2
有5個空桶,然後把arr1
裡的水倒進arr2
裡。
'500', 'id'=>'a1'), array('num'=>'300', 'id'=>'a2'), array('num'=>'200', 'id'=>'a3'));$arr2 = array( array('num'=>'400', 'id'=>'b1'), array('num'=>'200', 'id'=>'b2'), array('num'=>'200', 'id'=>'b3'), array('num'=>'100', 'id'=>'b4'), array('num'=>'100', 'id'=>'b5'));st($arr1, $arr2);// 從$a往$b的水桶倒水 $a=>$bfunction st($a, $b){ $a_len = count($a); $b_len = count($b); $i = 0; // $a的當前位置 $j = 0; // $b的當前位置 $result = array(); while( $i<$a_len && $j<$b_len ){ $item_1 = $a[$i]; $item_2 = $b[$j]; $item = array(); $item_1['num'] = intval( $item_1['num'] ); $item_2['num'] = intval( $item_2['num'] ); if( $item_2['num'] > $item_1['num'] ){ // 當前b的水桶比a的大,把a倒完,再從a裡取下一個水桶,因此$i++ // num值為a的水桶裡所有的水 $item = array('aid'=>$item_1['id'], 'bid'=>$item_2['id'], 'num'=>$item_1['num']); $b[$j]['num'] -= $item_1['num']; // b的水桶還能倒的水 $i++; }else if( $item_2['num'] < $item_1['num'] ){ // 當前b的水桶小,會溢出來,因此b當前的這個桶就裝滿了。倒滿之後再取一個桶,因此$j++ // num值為b的體積 $item = array('aid'=>$item_1['id'], 'bid'=>$item_2['id'], 'num'=>$item_2['num']); $a[$i]['num'] -= $item_2['num']; $j++; }else{ $item = array('aid'=>$item_1['id'], 'bid'=>$item_2['id'], 'num'=>$item_2['num']); $i++; $j++; } array_push($result, $item); } echo "
"; print_r($result);}
從例子來看數組1可以理解為收入,數組2可以理解為支出,所謂的組合結果類似餘額的變化過程,但是一定要指明基於哪條收入進行支出的又沒意義。所以,組合不出來,這種問題看源碼沒什麼用,還是要看需求,如果你覺得透露需求違反保密協議就不要問了。
硬拼這個結果不是不行,而是沒價值。