array_unique() / array_reverse() / array_pad()
| 対応: | PHP 4(2000) |
|---|
配列から重複を削除したり、要素の順序を反転したり、指定した長さに拡張する関数です。
構文
// 配列から重複する値を削除する array_unique(配列, ソートフラグ); // 配列の要素の順序を反転する array_reverse(配列, キーを保持するか); // 配列を指定した長さまで値で埋めて拡張する array_pad(配列, サイズ, 埋める値); // 指定した値で配列を埋めて作成する array_fill(開始インデックス, 数, 値);
関数一覧
| 関数 | 概要 |
|---|---|
| array_unique($array, $flags) | 配列から重複する値を削除して返します。最初に出現した要素のキーが保持されます。 |
| array_reverse($array, $preserve_keys) | 配列の要素の順序を逆にした新しい配列を返します。 |
| array_pad($array, $size, $value) | 配列を指定した長さまで値で埋めて返します。正の値なら末尾、負の値なら先頭に追加されます。 |
| array_fill($start_index, $count, $value) | 指定した値で埋められた配列を作成して返します。 |
サンプルコード
sample_array_unique.php
<?php // エヴァパイロットの重複を削除する $pilots = ['碇シンジ', '綾波レイ', '惣流・アスカ・ラングレー', '碇シンジ', '渚カヲル', '綾波レイ']; $unique = array_unique($pilots); print_r($unique); // 重複が削除されて4つになる // キーが飛び飛びになるため、array_valuesで振り直す $clean = array_values($unique); print_r($clean); // キーが0から連番になる // 配列の順序を反転する $ranking = ['碇シンジ', '綾波レイ', '惣流・アスカ・ラングレー']; $reversed = array_reverse($ranking); print_r($reversed); // 配列を指定した長さに拡張する $scores = [80, 90, 70]; $padded_right = array_pad($scores, 5, 0); print_r($padded_right); // 末尾に0が追加されて5要素になる $padded_left = array_pad($scores, -5, 0); print_r($padded_left); // 先頭に0が追加されて5要素になる // 指定した値で配列を作成する $zeros = array_fill(0, 5, 0); print_r($zeros);
array_unique.php
php array_unique.php
Array
(
[0] => 碇シンジ
[1] => 綾波レイ
[2] => 惣流・アスカ・ラングレー
[4] => 渚カヲル
)
Array
(
[0] => 碇シンジ
[1] => 綾波レイ
[2] => 惣流・アスカ・ラングレー
[3] => 渚カヲル
)
Array
(
[0] => 惣流・アスカ・ラングレー
[1] => 綾波レイ
[2] => 碇シンジ
)
Array
(
[0] => 80
[1] => 90
[2] => 70
[3] => 0
[4] => 0
)
Array
(
[0] => 0
[1] => 0
[2] => 80
[3] => 90
[4] => 70
)
Array
(
[0] => 0
[1] => 0
[2] => 0
[3] => 0
[4] => 0
)
概要
『array_unique()』は配列内の重複する値を削除しますが、元のキーはそのまま保持されるため、キーが飛び飛びになります。連番のキーが必要な場合は『array_values()』と組み合わせるとよい。比較はデフォルトで文字列として行われますが、第2引数に『SORT_REGULAR』を渡すと型変換せずに比較できます。
『array_reverse()』は配列の要素を逆順にした新しい配列を返します。第2引数に『true』を渡すと元のキーが保持されます。ソートされた配列の順序を反転させたい場合にも使用します。
『array_pad()』はサイズが負の値の場合は先頭から埋め、正の値の場合は末尾から埋めます。配列がすでに指定したサイズ以上の場合は何も変更されません。『array_fill()』は初期値が同じ配列を手軽に作成できる関数です。
配列の並べ替えについては『sort() / rsort()』を参照してください。
キーが飛び飛びになる
array_unique()は元のキーを保持するため、重複削除後にキーが飛び飛びになる。連番が必要ならarray_values()と組み合わせる。
<?php $pilots = ['碇シンジ', '綾波レイ', '碇シンジ', '葛城ミサト']; $unique = array_unique($pilots); print_r($unique); // キー 0, 1, 3(2が抜ける) // 連番が必要な場合はarray_values()で振り直す $clean = array_values($unique); print_r($clean); // キー 0, 1, 2 と連番になる
unique_keys.php
php unique_keys.php
Array
(
[0] => 碇シンジ
[1] => 綾波レイ
[3] => 葛城ミサト
)
Array
(
[0] => 碇シンジ
[1] => 綾波レイ
[2] => 葛城ミサト
)
型変換を伴う比較
デフォルトでは文字列比較のため、1と"1"が同じとみなされて片方が削除される。SORT_REGULARを使うと型を考慮した比較になる。
<?php $data = [1, "1", true, 1.0]; // デフォルト(SORT_STRING): 文字列として比較 $default = array_unique($data); print_r($default); // 1つだけ残る // SORT_REGULAR: 型を考慮した比較 $regular = array_unique($data, SORT_REGULAR); print_r($regular); // より多くの要素が残る可能性がある
unique_types.php
php unique_types.php
Array
(
[0] => 1
)
Array
(
[0] => 1
)
型が混在する配列を扱う場合は意図した結果になるか事前に確認するとよい。
多次元配列には直接使えない
多次元配列に対してarray_unique()を使うとNoticeが出て期待した動作をしない。多次元配列の重複削除には別のアプローチが必要。
問題のあるパターン(Noticeが出て重複が残る):
<?php
$characters = [
['name' => '碇シンジ', 'unit' => '初号機'],
['name' => '綾波レイ', 'unit' => '零号機'],
['name' => '碇シンジ', 'unit' => '初号機'], // 重複
];
// 多次元配列に直接array_unique()を使うとNoticeが出て期待した動作をしない
$result = array_unique($characters); // Notice: Array to string conversion
print_r($result);
unique_multi_ng.php
php unique_multi_ng.php Notice: Array to string conversion
json_encode/decode を使ったアプローチ:
<?php
$characters = [
['name' => '碇シンジ', 'unit' => '初号機'],
['name' => '綾波レイ', 'unit' => '零号機'],
['name' => '碇シンジ', 'unit' => '初号機'], // 重複
];
$unique = array_values(array_unique(array_map('json_encode', $characters)));
$unique = array_map('json_decode', $unique);
print_r($unique);
unique_multi_ok.php
php unique_multi_ok.php
Array
(
[0] => stdClass Object
(
[name] => 碇シンジ
[unit] => 初号機
)
[1] => stdClass Object
(
[name] => 綾波レイ
[unit] => 零号機
)
)
実践パターン
タグの重複削除
エヴァのキャラクター属性タグから重複を除いてリスト化する例。
<?php
$tags_raw = ['パイロット', 'NERV', 'パイロット', '使徒', 'NERV', '渚カヲル'];
$tags = array_values(array_unique($tags_raw));
echo implode(', ', $tags);
unique_tags.php
php unique_tags.php パイロット, NERV, 使徒, 渚カヲル
配列の末尾とデフォルト値の設定(array_pad)
5人分の出撃フラグを0で初期化してから一部を設定する例。
<?php $active = [1, 1]; // 碇シンジ・綾波レイが出撃中 $flags = array_pad($active, 5, 0); // 5人分のスロットをデフォルト0で埋める print_r($flags);
unique_pad.php
php unique_pad.php
Array
(
[0] => 1
[1] => 1
[2] => 0
[3] => 0
[4] => 0
)
記事の間違いや著作権の侵害等ございましたらお手数ですがこちらまでご連絡頂ければ幸いです。