添え字、果物、個数
1 apple 10
2 orange 5
3 orange 2
4 melon 6
5 banana 3
6 apple 4
このよう多次元配列において、同じ果物がある場合は、
質問1)個数の大きいもののみ残してソートする、その際添え字は振り直す
質問2)個数の大きいもののみ残して、果物のアルファベット順にソートする (添え字は再度振りなおす)をしたいです。
質問1の理想的な実行結果)
1 apple 10
2 orange 5
3 melon 6
4 banana 3
質問2の理想的な実行結果)
1 apple 10
2 banana 3
3 melon 6
4 orange 5
このようにしたいのですが、PHPのarray_uniqueには多次元配列は対応していません。
array_keys()を使って個数を取得し、maxを使ってなんとかならないか・・
array_multisort をうまく使えないか・・・
とアルゴリズムを考えています。
アドバイスお願いします。
PHP
1$item = <<< FORM 21 apple 10 32 banana 3 43 melon 6 54 orange 5 6FORM; 7 8$item = explode("\n",$item); 9$item2 = array(); 10foreach($item as $value){ 11$item2[] = explode(" ",$value); 12} 13 14/* 15これで多次元配列$item2 に配列としてデーターが入る 16 17 18*/
#追記
こんなかんじのアルゴリズムを思いついたのですが、
//もしみつかったら既存の配列と比較して、大きいほうのみ残す
この処理を使って書く方法はありませんか?
ループではapple,10が先に格納されていて、あとのapple,4と比較したとき
10 > 4
なので、apple4は格納しない
というイメージです。
orangeの場合は、先にorange,2が格納されているので
orange,5と比較すると5のほうが大きいので、orange,2を削除してorange,5を格納する
ということです。
処理としては
}else{
//もしみつかったら既存の配列と比較して、大きいほうのみ残す
}
この部分に記載したいです。この部分に記載するアルゴリズムを教えてください。
PHP
1<? 2$org = [ 3 ['apple', 10], 4 ['orange', 2], 5 ['orange', 5], 6 ['melon', 6], 7 ['banana', 3], 8 ['apple', 4], 9]; 10 11 $tmp = array(); 12 $array_result = array(); 13 14 foreach( $org as $key => $value ){ 15 16 // 配列に値が見つからなければ$tmpに格納 17 if( !in_array( $value[0], $tmp ) ) { 18 $tmp[] = $value[0]; 19 $array_result[] = $value; 20 }else{ 21//もしみつかったら既存の配列と比較して、大きいほうのみ残す 22 23 } 24 25 } 26 $data = $array_result; 27 28print_r($data); 29?>