LoginSignup
17
15

More than 5 years have passed since last update.

次のような配列が二つあるとします。

Last updated at Posted at 2016-06-23

結構満足のいくゴルフネタを思いついたのでQiitaにも投稿

問題

次のような配列が二つあるとします。 - Yahoo!知恵袋

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);
17
15
7

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
17
15