配列の比較・検索

PHPのシンタックス

  1. HOME
  2. 配列の比較と検索

配列の値を検索する

配列の検索で簡単なのは in_array()を使った検索です。配列に探している値があるかチェックし、見つかればtrue、見つからなければfalceを返します。
配列に値があるかどうかをチェック
$isIn = in_array($value,$array);
配列$arrayに$valueが見つかれば、$isInにtrueが代入されます。インデックス配列、連想配列のどちらの値でも検索可能

値を自然順位並べて検索して表示

  1. 4108は見つかりません
  2. 4350番は合格です
  3. 4488番は合格です
  4. 4691は見つかりません
<?php
$numlist = [4108, 4350, 4488, 4691];
$numbers = [4426, 4350, 4444, 4488, 4424];

function checkNumber($no) {
  global $numbers;
  if(in_array($no,$numbers)) {
    echo "{$no}番は合格です";
  } else {
    echo "{$no}は見つかりません";
  }
}
echo "<ol>\n";
foreach ($numlist as $value) {
  echo "<li>",checkNumber($value),"</li>\n";
}
echo "</ol>\n";
?>

文字列の配列を検索(完全一致検索)

桃太郎は仲間です
赤鬼は仲間ではありません
浦島太郎は仲間です
一寸法師は仲間です
<?php
$nameList = ["桃太郎","浦島太郎","一寸法師"];

function namecheck ($name) {
  global $nameList;
  if (in_array($name,$nameList)) {
    echo "{$name}は仲間です";
  } else {
    echo "{$name}は仲間ではありません";
  }
}

echo namecheck("桃太郎"),"\n <br>";
echo namecheck("赤鬼"),"\n <br>";
echo namecheck("浦島太郎"),"\n <br>";
echo namecheck("一寸法師"),"\n <br>";
?>

新規の値だけを追加する

新規の値だけを配列に追加する関数 array_addUnique()をin_array()を利用して作成。第1引数で元の配列、第2引数で追加する値を渡します。
追加する値がin_array()でチェックし存在するならfalceを渡し、存在しなければ値を追加してtrueを返します。第1引数には&をつけて&$arrayとして参照渡しをしているので、引数で渡した配列を直接操作しています。

配列に新規の値だけを追加

Array ( [0] => キビ団子 [1] => 剣 [2] => 金棒 [3] => 草履 [4] => 盾 )
<?php
function array_addUnique(&$array, $value)
{
  if (in_array($value, $array)) {
    return false;
  } else {
    $array[] = $value; //値が含まれていなかった時に値を追加
    return true;
  }
}

$myList = ["キビ団子", "剣",];
array_addUnique($myList, "金棒");
array_addUnique($myList, "草履");
array_addUnique($myList, "盾");
print_r($myList);
?>

値が見つかった位置、キーを返す

array_search()は見つかった値のキーを返します。
インデックス配列の場合は値のインデックス番号がキーとして戻ります。複数の値が一致する場合は一番最初に見つかった値のキーを返します。見つからない場合はfalseが返る。

見つかったキーで別の配列から値を取り出す

桃太郎さんは16歳です。
浦島太郎さんは55歳です。
織姫さんは20歳です。
「赤鬼」はメンバーではない。
<?php
$nameList = ["m01" => "桃太郎", "m02" => "浦島太郎", "w01" => "織姫", "w02" => "月姫"];
$ageList = ["m01" => 16, "m02" => 55, "w01" => 20, "w02" => 25];

function getAge($name)
{
  global $nameList;
  global $ageList;
  $key = array_search($name, $nameList);
  if ($key !== false) { // !== 値または型が等しくない
    $age = $ageList[$key];
    echo "{$name}さんは{$age}歳です。";
  } else {
    echo "「{$name}」はメンバーではない。";
  }
}
echo getAge("桃太郎"),"\n <br>";
echo getAge("浦島太郎"),"\n <br>";
echo getAge("織姫"),"\n <br>";
echo getAge("赤鬼"),"\n <br>";
?>

配列を比較して一致しない値を見つける

array_diff()を使うことで、配列Aと配列Bを比較して配列Aの中から配列Bにはない値を見つけ出すことができます。

aとbのどちらにもない値を取り出す

a11は新規です。
c33は新規です。
<?php
$checkID = ["a11", "b22", "c33", "d44"];
$aList = ["b22", "c15", "a12", "d55"];
$bList = ["a8", "c22", "c55", "d44"];

$diffID = array_diff($checkID, $aList, $bList);
foreach ($diffID as $value) {
  echo "{$value}は新規です。\n <br>";
}
?>

配列の値を検索置換する

「文字列の検索」でstr_replace(),str_ireplace()を使って文字列を置換したが、配列の検索置換も行えます。検索できるのはインデックス配列の値のみで、連想配列の値を検索したい場合はpreg_replace()を使う。

配列の値を検索置換して表示する

社内備品:
飲み水ウォーター、ソリッド・ステート・ドライブ250G、ハード・ディスク・ドライブ500G
<?php
$data = ["ミネラルウォーター", "SSD250G", "HDD500G"];
$seach = ["ミネラル", "SSD", "HDD"];
$replacement = ["飲み水", "ソリッド・ステート・ドライブ", "ハード・ディスク・ドライブ"];
$result = str_replace($seach, $replacement, $data);
echo "社内備品:\n <br>";
echo $result[0], "、", $result[1], "、", $result[2];
?>

正規表現を使って配列を検索する(部分一致検索)

preg_grep()は正規表現を使って配列を検索しましたが、配列の検索も可能です。文字列の部分一致、大文字小文字を区別せずに検索、マッチした複数の値を取り出すといったことが可能になる。
preg_grep()の第3引数にPREG_GREP_INVERTを指定すると、マッチしなかった値を配列として取り出すことができます。

配列から「太郎」の付く名前を取り出す

該当者3件
桃太郎
浦島太郎
金太郎
該当しない2件
一寸法師
赤鬼
<?php
$nameList = ["桃太郎", "一寸法師", "浦島太郎", "赤鬼", "金太郎"];
$pattern = "/太郎/";
$result = preg_grep($pattern, $nameList);
$noresult = preg_grep($pattern, $nameList, PREG_GREP_INVERT);
echo "<b>該当者</b>" . count($result) . "件\n <br>";
foreach ($result as $value) {
  echo $value, "\n <br>";
}
echo "<b>該当しない</b>" . count($noresult) . "件\n <br>";
foreach ($noresult as $value) {
  echo $value, "\n <br>";
}
?>

配列の値を正規表現で検索置換する

preg_replace()も配列の値を正規表現で置換可能。
※配列の値は書き換えではなく新しい配列を返す!!
先程のstr_replace()と違って、連想配列の値を検索できます。

電話番号の末尾4桁を伏字にして表示する

name:桃太郎
age:18
phone:080-8888-****
name:一寸法師
age:32
phone:090-1919-****
name:浦島太郎
age:40
phone:092-333-****
name:赤鬼
age:55
phone:0120-888-****
<?php
$data = [];
$data[] = ["name" => "桃太郎", "age" => 18, "phone" => "080-8888-8888"];
$data[] = ["name" => "一寸法師", "age" => 32, "phone" => "090-1919-1919"];
$data[] = ["name" => "浦島太郎", "age" => 40, "phone" => "092-333-4444"];
$data[] = ["name" => "赤鬼", "age" => 55, "phone" => "0120-888-8888"];
$pattern = "/(-)\d{4}$/";
$replacement = "$1****";
foreach ($data as $user) {
  $result = preg_replace($pattern, $replacement, $user); //番号末尾4桁伏せ字
  foreach ($result as $key => $value) {
    echo "{$key}:", $value, "\n <br>";
  }
}
?>