PHP の foreach で配列の最初と最後の要素をスキップする方法

はじめに

実務にて、Web スクレイピングで取得した table 要素の tr 要素を foreach で最初と最後だけスキップしてデータベースに保存する仕事があり、それを解決した情報になります。Web 開発の初心者、初学者の方にもわかりやすいように、ソースコードを編集してサンプルを公開しています、ご参考になれば幸いです。

検証環境

サンプル

解説

PHP 7.3 以上

PHP 7.3 以上では、配列の最初のキーを取得できる array_key_first と、配列の最後のキーを取得できる array_key_last という便利な関数が実装されているので、下記のように実現することができます。

$array = [
  'Tsukumo Sana',
  'Ceres Fauna',
  'Ouro Kronii',
  'Nanashi Mumei',
  'Hakos Baelz',
];

$first = array_key_first($array);
$last = array_key_last($array);
foreach ($array as $k => $v) {
  if ($k === $first || $k === $last) continue;
  var_dump($v); // string(11) "Ceres Fauna", string(11) "Ouro Kronii", string(13) "Nanashi Mumei"
}

PHP 7.3 未満

PHP 7.3 未満では、array_key_first と array_key_last が実装されていません。

無いなら自分で関数を作っちゃいましょう。PHP マニュアルに Polyfill(ポリフィル)の情報があります。Polyfill とは、実装されていない新機能を古いバージョンでも動作するように独自に実装したコードのことです。

  1. array_key_first の Polyfill
  2. array_key_last の Polyfill

Polyfill を参考にしながら ユーザー定義関数 を作りましょう。

$array = [
  'Tsukumo Sana',
  'Ceres Fauna',
  'Ouro Kronii',
  'Nanashi Mumei',
  'Hakos Baelz',
];

if (!function_exists('array_key_first')) {
  function array_key_first(array $array) {
    foreach ($array as $k => $v) return $k;
    return null;
  }
}

if (!function_exists('array_key_last')) {
  function array_key_last(array $array) {
    if (empty($array)) return null;
    return array_keys($array)[count($array) - 1];
  }
}

$first = array_key_first($array);
$last = array_key_last($array);
foreach ($array as $k => $v) {
  if ($k === $first || $k === $last) continue;
  var_dump($v); // string(11) "Ceres Fauna", string(11) "Ouro Kronii", string(13) "Nanashi Mumei"
}

reset + end

配列の要素の値に重複がない場合は、resetend で実現することができます。

$array = [
  'Tsukumo Sana',
  'Ceres Fauna',
  'Ouro Kronii',
  'Nanashi Mumei',
  'Hakos Baelz',
];

$first = reset($array);
$last = end($array);
foreach ($array as $k => $v) {
  if ($v === $first || $v === $last) continue;
  var_dump($v); // string(11) "Ceres Fauna", string(11) "Ouro Kronii", string(13) "Nanashi Mumei"
}

count

シンプルに count で実現することもできます。

$array = [
  'Tsukumo Sana',
  'Ceres Fauna',
  'Ouro Kronii',
  'Nanashi Mumei',
  'Hakos Baelz',
];

$i = 0;
$element_count = count($array);
foreach ($array as $v) {
  if ($i++ === 0 || $i === $element_count) continue;
  var_dump($v); // string(11) "Ceres Fauna", string(11) "Ouro Kronii", string(13) "Nanashi Mumei"
}

PHP 5 の foreach は配列のポインタに依存するので、反復処理で予期せぬ振る舞いを引き起こすことがあるので注意しましょう。PHP 7 の foreach では配列のポインタを使わなくなりました。

以上です。

おわりに

サンプルのソースコードを再利用する際は、要件定義やコーディング規約にお気を付けください。