[PHP] 如何判斷關聯式陣列與循序式陣列?

PHP 陣列索引預設為由 0 開始遞增的循序數列,同時也支援自行設定索引值。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
// 序列式
$sequentialArray = ['A', 'B', 'C'];
/*
Array
(
    [0] => A
    [1] => B
    [2] => C
)
*/

// 關聯式
$associativeArray = ['a' => 'A', 'b' => 'B', 'c' => 'C'];
/*
Array
(
    [a] => A
    [b] => B
    [c] => C
)
*/

判斷兩者的方式為檢查陣列索引是否為一公差為 1 的循序數列。先利用 array_keys() 取得所有陣列索引值後,再利用 range() 產生一個循序整數陣列,比對兩者內容即可判斷:

1
2
3
4
5
6
7
8
9
function is_assoc( array $array ) {
    if ( [] === $array ) return false;
    return array_keys($array) !== range(0, count($array) - 1);
}

var_dump( is_assoc(['a', 'b', 'c']) ); // false
var_dump( is_assoc(['0' => 'a', '1' => 'b', '2' => 'c']) ); // false
var_dump( is_assoc(['1' => 'a', '0' => 'b', '2' => 'c']) ); // true
var_dump( is_assoc(['a' => 'a', 'b' => 'b', 'c' => 'c']) ); // true

Reference: How to check if PHP array is associative or sequential? - Stack Overflow

Licensed under CC BY-NC-SA 3.0 TW
comments powered by Disqus