1. ホーム
  2. Web プログラミング
  3. PHP プログラミング
  4. phpのヒント

PHPで配列をトラバースする6つの方法まとめ

2022-01-18 20:40:02

配列はPHPの日常業務において最も頻繁に登場する構造であり、ほぼ毎日配列に関連する内容を扱っています。そこで質問ですが、一般的にどのように配列の反復処理と作業を行うのでしょうか。

1. フォアグラウンド

身近なもの、お気に入りなのでは?

$arr = ['a', 'b', 'c'];

foreach ($arr as $key => $value) {
    $arr[$key] = $value . '_i';
}

print_r($arr); // ['a_i', 'b_i', 'c_i'];



2. array_map

無名関数を使って配列の各要素を処理します。探索が完了したら新しい配列を返す

$arr = ['a', 'b', 'c'];

$arr = array_map(function ($item) {
    return $item . '_i';
}, $arr);

print_r($arr); // ['a_i', 'b_i', 'c_i'];



複数の配列を同時に扱うことができる

$arr_1 = ['a', 'b', 'c'];
$arr_2 = ['you', 'good', 'do', 'original', 'sin'];
// $arr_n = [...] ;

$arr = array_map(function ($item_1, $item_2) {
    return $item_1 . '_' . $item_2 . '_i' ;
}, $arr_1, $arr_2);

print_r($arr); // ['a_you_i', 'b_well_i', 'c_?_i', '_original_i', '_sin_i']



はい、トラバースの回数は最長配列が基準です。

3回繰り返した後、$arr_1が実際に終了するので、その後$item_1の値はnullになる

3. array_walk

戻り値がなく、1つの配列だけを扱う参照配列で、配列を繰り返し処理します。

$arr = ['a', 'b', 'c'];

array_walk($arr, function (&$item) {
    $item = $item . '_i';
});

print_r($arr); // ['a_i', 'b_i', 'c_i'];



そう、余分な&は、フォームのパラメータがデータを受け取るために参照渡しされていることを意味します。このパラメータをどのように変更すればよいかを考えるだけでよいのです。

2次元の配列を扱う場合も、扱い方は同じです。

$arr = [
    ['name' => 'a'],
    ['name' => 'b'],
    ['name' => 'c']
];

array_walk($arr, function (&$item) {
    $item['name'] = $item['name'] . '_i';
});

print_r($arr); // [['name' => 'a_i'], ['name' => 'b_i'], ['name' => 'c_i']];



4.

これは超汎用構文であるべき

$arr = ['a', 'b', 'c'];

for ($i = 0; $i < count($arr); ++$i) {
    $arr[$i] = $arr[$i] . '_i';
}

print_r($arr); // ['a_i', 'b_i', 'c_i'];



お勧めしません。foreachほど効率的ではなく、foreachよりも若干書き方が面倒です。

5.それぞれ

ははは、この関数はPHP7.2の@deprecatedで非推奨になったし、特に書き方が古くさく感じるね。この書き方だと実行効率も悪いし、初心者はさっさと落とした方がいい。

$arr = ['a', 'b', 'c'];

while (list($key, $value) = each($arr)) {
    $arr[$key] = $value . '_i';
}

print_r($arr); // ['a_i', 'b_i', 'c_i'];



6. リセット

それは、関数をリセットするよりも、複数の組み込み関数を組み合わせる必要があると言うことは正確です、通常はコードを書くことは基本的に使用されていません

$arr = ['a', 'b', 'c'];
// reset() switches the pointer to the head, which actually points to the beginning by default, so you can ignore this line
reset($arr);

// current() gets the current pointer's element value
while ($value = current($arr)) {
    // key() gets the subscript of the element of the current pointer
    $arr[key($arr)] = $value . '_i';
    // next() move the pointer to the next
    next($arr);
}

print_r($arr); // ['a_i', 'b_i', 'c_i'];


要約

この記事では、PHPで配列を反復処理する6つの方法についてご紹介します。PHPで配列を繰り返し処理する方法については、スクリプトハウスの過去記事を検索するか、引き続き以下の関連記事を閲覧してください。