🍑

[PHP]ある配列の要素が別の配列にない場合はその要素を削除する

2022/12/23に公開
2

概要

ある配列の要素が別の配列に存在するか検索→存在しない場合はその要素を削除するサンプルコード
簡単そうに見えてハマりポイント満載だったので覚書きかねて書きました
rana_kualu 様のコメントにより修正。array_intersectを使えば一発でした。

サンプルコード

(1) インデックス配列の場合

arraySearchAndUnsetIndex.php
<?php

$arr1 = [1,2,3,4,5,6];
$arr2 = [1,3,4,5,7,8];

var_dump(array_intersect($arr1,$arr2)); // 実行結果: 0=>1, 1=>3, 2=>4, 3=>5

/* 以下、修正前
foreach($arr1 as $key => $value){
            $offset = array_search($value, $arr2);
                if($offset === false)
                                unset($arr1[$key]);
}
// インデックスを詰める
$arr1 = array_values($arr1);
var_dump($arr1); // 実行結果: 0=>1, 1=>3, 2=>4, 3=>5
*/

補足事項

修正前の内容になりますが、

$arr1 = array_values($arr1);

の部分は、

$arr1 = array_merge([],$arr1);

としても同じ結果になる

(2) 連想配列の場合

arraySearchAndUnsetAssoc.php
<?php

<?php

$belongs = ['Rina'=>'volleyball', 'Emilia'=>'karate', 'Sala'=>'basketball', 'Franchesca'=>'tennis', 'Julia'=>'fencing'];
$clubs = ['tennis','volleyball','basketball','football'];

var_dump(array_intersect($belongs, $clubs)); // 実行結果: 'Rina'=>'volleyball',' Sala'=>'basketball','Franchesca'=>'tennis'

/* 以下、修正前
foreach($belongs as $key => $value){
    $offset = array_search($value, $clubs);
    if($offset === false)
        unset($belongs[$key]);
}

var_dump($belongs); // 実行結果: 'Rina'=>'volleyball',' Sala'=>'basketball','Franchesca'=>'tennis'
*/

ポイント

array_intersectを使えば1行で完了でした。

もともと書いていた以下の内容は単に配列を検索したい時のポイントになりそう

  • array_searchで配列の要素(値)を検索
  • 検索結果(オフセット)が0の場合もあるため、!$offset$offset == falseでなく、$offset === falseを使用
  • インデックス配列の場合、unsetしただけでは、インデックスは変わらないので、array_values(もしくはarray_merge)を使って前詰めする

参考

Discussion