
ブログをNext.js14(App Router)でリファクタリングしました
複数の言語を同時に書いていると、言語の仕様や関数名の違いから混乱することもあると思います。個人的に、PHPとJavaScriptを並行して書くことが多くなってきたので、両者の書き方の違いについてまとめました。PHPとJavaScriptの書き方の違いについて、前回は仕様の違いについてまとめました。今回は配列操作編です。
目次
以下、PHPの配列を$ary、JSの配列をaryとします。また、引数が多く意味が分かりづらい関数については実例も交えて説明します。
PHP | JS | Python |
---|---|---|
count($ary) | ary.length | len(ary) |
破壊的操作
操作 | PHP | JS | Python |
---|---|---|---|
末尾に追加 | 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] |
非破壊的操作
PHP | JS | Python |
---|---|---|
array_merge($ary1, $ary2) | ary1.concat(ary2) | ary1 + ary2 |
非破壊的操作
PHP | JS | Python |
---|---|---|
array_slice($ary, 開始index [,要素数]) | ary.slice(開始index [,終了index + 1]) | ary[スライス] |
開始indexの位置から部分配列を取得します。
破壊的操作
PHP | JS | Python |
---|---|---|
array_splice($ary, 削除開始index [,削除する要素数] [,挿入する配列]) | ary.splice(削除開始index [,削除する要素数] [挿入するスカラー値1, 値2,…]) | 追加:ary.insert(オフセット, 挿入配列) 削除:del ary[スライス] |
$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]
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 | Python |
---|---|---|
sort($ary, [ソート定数])/ rsort()やasort()/usort()など | ary.sort([自作ルール]) デフォルトのソートは文字列 ary.reverse()で逆転ソート可 | ary.sort([自作ルール]) デフォルトのソートは数値 sort関数の第2引数は逆転ソートのフラグ |
以下、詳しく説明します。
関数 | 順番 | 配列の種類 | ソートするもの |
---|---|---|---|
sort | 昇順 | 配列 | 値 |
rsort | 降順 | 配列 | 値 |
asort | 昇順 | 連想配列 | 値 |
arsort | 降順 | 連想配列 | 値 |
ksort | 昇順 | 連想配列 | キー |
krsort | 降順 | 連想配列 | キー |
usort | – | – | 自作ルール |
定数 | 意味 |
---|---|
SORT_NUMERIC | 数値順にソート |
SORT_STRING | 文字順にソート |
SORT_NATURAL | 自然順ソート |
$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はデフォルトで文字順ソートしかしません。数値順ソートも自分で実装する必要があります。
const num = [10, 5, 1 ,8, 0];
//数値順、昇順にソート
num.sort((a, b) => a - b)
console.log(num)
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 | Python | |
---|---|---|---|
関数 | array_search(要素, $ary, [厳密等価で比較するか]) | ary.indexOf(要素)/ ary.lastIndexOf(要素) | ary.index(要素[,開始index[,終了index] |
見つからなかった場合 | falseを返す | -1を返す | エラー |
比較方法 | 第3引数をtrueにすると厳密等価で検索 | 厳密等価で検索 | – |
要素があるかどうか確認します。検索結果が無かった場合も存在の有無が確認できますが、別途関数があります。
PHP | JS | Python |
---|---|---|
in_array(要素, $ary) | ary.some(callback)/ ary.every(callback) | 要素 in ary |
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
操作 | PHP | JS |
---|---|---|
順次 | array_walk($ary, callback(要素, index){…}) | ary.forEach(callback(要素,index){…}) |
Map | array_map(callback(要素){…}, $ary) | ary.map(callback(要素,index){…}) |
Filter | array_filter($ary, callback(要素){…}) | ary.filter(callback(要素,index){…}) |
Reduce | array_reduce($ary, callback(蓄積値, 要素), 初期値) | ary.reduce(callback(蓄積値, 要素), 初期値) |
pythonは内包表記を使うと良いです。
以上、よく使うであろう配列操作の方法について見てきました。この他にも紹介しきれなかった操作もたくさんありますので適宜調べてみてください。
シェア!
関連記事
最新の記事
カテゴリー一覧
アーカイブ