結構満足のいくゴルフネタを思いついたのでQiitaにも投稿
問題
aiida123456さん
2016/6/2119:07:22
次のような配列が二つあるとします。① Array ( [0] => 8 [1] => 9 [2] => 10 [3] => 10 [4] => 8 ) ② Array ( [0] => 2 [1] => 3 [2] => 3 [3] => 3 [4] => 1 )
①の配列は同じ配列の値があれば、その値をまとめて
②の配列はそれに対応し、足されるようにするにはどのようにすればいいですか?例えば、①は[0]と[4]の値が8が同じ。[2]と[3]の値が10が同じなので
① Array ( [0] => 8 [1] => 9 [2] => 10 ) ② Array ( [0] => 3 [1] => 3 [2] => 6 )
というような形にしたいです。
ご教授お願いいたします。
解答
解説なし
<?php
$a = [8, 9, 10, 10, 8];
$b = [2, 3, 3, 3, 1];
$uniq = array_unique($a);
$pos = array_flip($uniq);
$count = array_fill_keys($pos, 0);
foreach ($a as $k => $v) {
$count[$pos[$v]] += $b[$k];
}
$a = array_values($uniq);
$b = array_values($count);
var_dump($a, $b);
解説あり
<?php
$a = [8, 9, 10, 10, 8];
$b = [2, 3, 3, 3, 1];
// 重複値を削除した配列 (キーは前優先)
$uniq = array_unique($a);
// 「値 => 最初の出現位置」の連想配列
$pos = array_flip($uniq);
// 「最初の出現位置 => 0」の連想配列
$count = array_fill_keys($pos, 0);
// 「最初の出現位置」に対応する数値に
// 現在の「値」の対応値を加算
foreach ($a as $k => $v) {
$count[$pos[$v]] += $b[$k];
}
// キーを0からの連番に振り直す
$a = array_values($uniq);
$b = array_values($count);
var_dump($a, $b);