配列・連想配列

【PHP】arrayが配列か連想配列かどうか判定する方法

更新日:2024/02/27

PHPには連想配列というものがあります。
普通の配列を処理したいときに、連想配列を渡されると困りますね。
そこで、ある変数が普通の配列か連想配列かを判定する方法を紹介します。

 

そもそも配列とは何だろう

一般的な配列は、PHPのドキュメントで添字配列と表現されています。
この添字配列と連想配列は、構造上は同じものです。

PHPは添字配列と連想配列の区別が無いため、判定する機能もないようです。
そのため、自分で判定するコードを作成する必要があります。

そこで問題になるのが、そもそも添字配列とは何かですね。
これをしっかりと定義しておかないと、コードを作成できません。

今回は、PHPで一般的な方法で配列を作成したときの構造を持つものを、添字配列とします。
一般的な方法とは、キーを指定しないで生成する方法です。

添字配列

$array = [ 'a' , ' b ' , 'c' ];
  // または
$array = array( 'a' , ' b ' , 'c' );

キーを指定すると、連想配列になります。

連想配列

$array = [ 'a' => 'a' , 'b' => ' b ' , 'b' => 'c' ];
  // または
$array = array( 'a' => 'a' , 'b' => ' b ' , 'b' => 'c' );

数値キーのみでも連想配列です。

連想配列

$array1 = [ '0' => 'a' , '1' => ' b ' , '2' => 'c' ];
$array2 = [ '3' => 'a' , '4' => ' b ' , '5' => 'c' ];

ただし上記の$array1は、キー指定なしと同じものが生成されます。
そのため、添字配列として扱います。

では、添字配列の構造を確認してみます。

添字配列の構造

$array = [ 'a' , ' b ' , 'c' ];
var_dump( $a );
// array(3) {
//   [0]=>
//   string(1) "a"
//   [1]=>
//   string(1) "b"
//   [2]=>
//   string(1) "c"
// }

0から順番に並んでいます。

そこで、今回は『配列か連想配列か』の配列を次のように定義します。

配列とは:キーが数値で、0から順番に並んでいるもの

unset()などで添字の順番が飛んだ場合はどうしましょう…
個人的には要素数を返すcount()の結果から1を引いたものと、一番大きな数値キーの値が異なるのは違和感があります。
そのため、今回は配列とはみなさないことにします。

 

配列かどうかを判定するコード

前置きが長くなりました。
配列か連想配列かどうかを確認するコードを作成します。

キーを順番に取り出して、0から並んでいるかをチェックするだけです。

引数が配列かどうかを判定する関数

function is_indexed_array( $array ){
    $index = 0;
    foreach( $array as $key => $value ){
        if( $index++ !== $key ) return false;
    }
    return true;
}

確認してみます。

echo is_indexed_array([ 'a' , 'b' , 'c' ]) ? "配列\n" : "連想配列\n";
// 結果: 配列
echo is_indexed_array([ 'a' => 'a' , 'b' => 'b' , 'c' => 'c' ]) ? "配列\n" : "連想配列\n";
// 結果: 連想配列

想定通りの結果が出ました。

更新日:2024/02/27

書いた人(管理人):けーちゃん

スポンサーリンク

記事の内容について

null

こんにちはけーちゃんです。
説明するのって難しいですね。

「なんか言ってることおかしくない?」
たぶん、こんなご意見あると思います。

裏付けを取りながら記事を作成していますが、僕の勘違いだったり、そもそも情報源の内容が間違えていたりで、正確でないことが多いと思います。
そんなときは、ご意見もらえたら嬉しいです。

掲載コードについては事前に動作確認をしていますが、貼り付け後に体裁を整えるなどをした結果動作しないものになっていることがあります。
生暖かい視線でスルーするか、ご指摘ください。

ご意見、ご指摘はこちら。
https://note.affi-sapo-sv.com/info.php

 

このサイトは、リンクフリーです。大歓迎です。