thumbnail

PHP・JavaScript・Pythonの配列操作の違いまとめ【比較】

複数の言語を同時に書いていると、言語の仕様や関数名の違いから混乱することもあると思います。個人的に、PHPとJavaScriptを並行して書くことが多くなってきたので、両者の書き方の違いについてまとめました。PHPとJavaScriptの書き方の違いについて、前回は仕様の違いについてまとめました。今回は配列操作編です。

以下、PHPの配列を$ary、JSの配列をaryとします。また、引数が多く意味が分かりづらい関数については実例も交えて説明します。

配列の長さ

PHPJSPython
count($ary)ary.lengthlen(ary)

要素の追加、削除

破壊的操作

操作PHPJSPython
末尾に追加array_push($ary, 要素)ary.push(要素)ary.append(要素)
末尾を削除array_pop($ary)ary.pop()ary.pop() or del ary[-1]
先頭に追加array_unshift($ary, 要素)ary.unshift(要素)ary.insert(0, 要素)
先頭を削除array_shift($ary)ary.shift()del ary[0]

配列の結合

非破壊的操作

PHPJSPython
array_merge($ary1, $ary2)ary1.concat(ary2)ary1 + ary2

部分配列の取得

非破壊的操作

PHPJSPython
array_slice($ary, 開始index [,要素数])ary.slice(開始index [,終了index + 1])ary[スライス]

開始indexの位置から部分配列を取得します。

途中の要素の追加、削除

破壊的操作

PHPJSPython
array_splice($ary, 削除開始index [,削除する要素数] [,挿入する配列])ary.splice(削除開始index [,削除する要素数] [挿入するスカラー値1, 値2,…])追加:ary.insert(オフセット, 挿入配列)
削除:del ary[スライス]

PHPのコード例

$num = [0,1,2,3,4,5,6,7,8,9];
//$num[3]から5個要素を削除、
//そこに[100, 200, 300]を挿入
array_splice($num, 3, 5, [100, 200, 300]);
print_r($num); //[0, 1, 2, 100, 200, 300, 8, 9]

JSのコード例

const num = [0,1,2,3,4,5,6,7,8,9]
//num[3]から5個要素を削除、
//そこに100, 200, 300を挿入
num.splice(3, 5, 100, 200, 300)
console.log(num) //[0, 1, 2, 100, 200, 300, 8, 9]
  • 関数の戻り値は削除した部分配列になる
  • 値を追加する場合、PHPは配列で、JSはスカラー値を1つ1つ渡す

要素のソート

破壊的操作

PHPJSPython
sort($ary, [ソート定数])/ rsort()やasort()/usort()などary.sort([自作ルール])
デフォルトのソートは文字列
ary.reverse()で逆転ソート可
ary.sort([自作ルール])
デフォルトのソートは数値
sort関数の第2引数は逆転ソートのフラグ

以下、詳しく説明します。

PHPのソート関数一覧

関数順番配列の種類ソートするもの
sort昇順配列
rsort降順配列
asort昇順連想配列
arsort降順連想配列
ksort昇順連想配列キー
krsort降順連想配列キー
usort自作ルール

PHPのソート定数一覧

定数意味
SORT_NUMERIC数値順にソート
SORT_STRING文字順にソート
SORT_NATURAL自然順ソート

PHPのソート使用例

$num = [10, 5, 1 ,8, 0];
$str = ['hoge', 'fuga', 'a'];

//数値順、昇順にソート
sort($num, SORT_NUMERIC); // [0, 1, 5, 8, 10]
//文字順、降順にソート
rsort($str, SORT_STRING); // ['hoge', 'fuga', 'a']

JSのソート使用例

JSはデフォルトで文字順ソートしかしません。数値順ソートも自分で実装する必要があります。

const num = [10, 5, 1 ,8, 0];

//数値順、昇順にソート
num.sort((a, b) => a - b)
console.log(num)

Pythonのソート使用例

ary = [(200, 600, 10),(1, 4, 5), (10, 2, 3), (1, 1, 0)]
#タプルの合計値が大きい順にソート
ary.sort(key=lambda tmp: sum(tmp[0:]), reverse=True)
print(ary)
  • PHPはソートの方法を組み込み関数や定数である程度指定できる
  • JSのsort()は文字順ソート。数値順ソートや複雑なソートも全て自作ルールでカスタマイズ
  • Pythonは数値順ソート。reverseフラグがあり、昇順降順を簡単に切り替えられる。

要素の検索

要素が配列内にあるか検索します。

PHPJSPython
関数array_search(要素, $ary, [厳密等価で比較するか])ary.indexOf(要素)/ ary.lastIndexOf(要素)ary.index(要素[,開始index[,終了index]
見つからなかった場合falseを返す-1を返すエラー
比較方法第3引数をtrueにすると厳密等価で検索厳密等価で検索

要素が存在するか

要素があるかどうか確認します。検索結果が無かった場合も存在の有無が確認できますが、別途関数があります。

PHPJSPython
in_array(要素, $ary)ary.some(callback)/ ary.every(callback)要素 in ary

JSのsomeとeveryについて

callbackにはブール値を返す関数を定義します。
someは「配列の要素の内1つでも条件を満たす場合」、everyは「配列の要素の内全て条件を満たす場合」trueを返します。

//偶数+奇数の配列
const num = [1, 2, 4, 6, 8]
//偶数のみの配列
const even = [2, 4, 6, 8]

//1つでも偶数があればtrue
console.log(num.some(n => n % 2 === 0)) //true
console.log(even.some(n => n % 2 === 0)) //true

//全部偶数ならばtrue
console.log(num.every(n => n % 2 === 0)) //false
console.log(even.every(n => n % 2 === 0)) //true
  • どちらの言語も見つかった場合はブール値を返す

順次、Map、Filter、Reduce

操作PHPJS
順次array_walk($ary, callback(要素, index){…})ary.forEach(callback(要素,index){…})
Maparray_map(callback(要素){…}, $ary)ary.map(callback(要素,index){…})
Filterarray_filter($ary, callback(要素){…})ary.filter(callback(要素,index){…})
Reducearray_reduce($ary, callback(蓄積値, 要素), 初期値)ary.reduce(callback(蓄積値, 要素), 初期値)

pythonは内包表記を使うと良いです。

まとめ

以上、よく使うであろう配列操作の方法について見てきました。この他にも紹介しきれなかった操作もたくさんありますので適宜調べてみてください。