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

php array_walk array_map array_filter 差分ケーススタディ

2022-01-15 15:07:52
phpの開発者は、タイトルにあるこれらの関数が含まれる配列処理によく遭遇します。関数が似ているので、混乱することが多いようです。

array_walkです。

array_walk - ユーザ定義の関数を用いて、配列の各要素をコールバックする
1. ユーザー定義関数で各要素を処理
2. 新しい配列を作成せずに、元の配列を直接修正する。
3. 3. 追加のパラメータを渡すことができる
例1.

<?php
$fruits = array("d" => "lemon", "a" => "orange", "b" => "banana", " c" => "apple");

function test_alter(&$item1, $key, $prefix)
{
    $item1 = "$prefix: $item1";
}

function test_print($item2, $key)
{
    echo "$key. $item2<br />\n";
}

echo "Before ... :\n";
array_walk($fruits, 'test_print');

array_walk($fruits, 'test_alter', 'fruit');
echo "... and after:\n";

array_walk($fruits, 'test_print');
? >

//実行結果
以前は ... ..:
d. レモン
a. オレンジ
b. バナナ
c. リンゴ ...以降
d. 果物:レモン
a. 果物:オレンジ
b. 果物:バナナ
c. 果物:りんご

詳細については、以下の公式ドキュメントを参照してください。 http://php.net/manual/zh/function.array-walk.php

配列マップ

array_map - 配列の各要素にコールバック関数を適用する
1. 各配列の各要素に適用されるコールバック関数
2. 複数の配列、マージを扱うことができる
3. 新しく作成された配列を返す
4. 多次元配列を作成するコールバック関数の名前としてNULLを渡します。
5. 2つ以上の配列が渡された場合、それらの配列は同じ数の要素を持つことになります。これは、コールバック関数が対応する要素を並列に処理するためです。複数の配列が同じ要素数を持たない場合:空の要素は、短い配列を、長い配列と同じ長さになるまで展開します。

例1.

<?php
function cube($n)
{
    return($n * $n * $n);
}

$a = array(1, 2, 3, 4, 5);
$b = array_map("cube", $a);
print_r($b);
? >

//実行結果

Array
(
[0] => 1
[1] => 8
[2] => 27
[3] => 64
[4] => 125 

)

例2.

<?php
$func = function($value) {
    return $value * 2;
};

print_r(array_map($func, range(1, 5)));
? >

//実行結果

Array
(
[0] => 2
[1] => 4
[2] => 6
[3] => 8
[4] => 10 

)

例3.

<?php
function show_Spanish($n, $m)
{
    return("The number $n is called $m in Spanish");
}

function map_Spanish($n, $m)
{
    return(array($n => $m));
}

$a = array(1, 2, 3, 4, 5);
$b = array("uno", "dos", "tres", "cuatro", "cinco");

$c = array_map("show_Spanish", $a, $b);
print_r($c);

$d = array_map("map_Spanish", $a , $b);
print_r($d);
? >

//実行結果

// $cのプリントアウト
配列
(
[0] => 数字の1はスペイン語でuno(ウノ)といいます。
[1] => 数字の2はスペイン語でdos(ドス)といいます。
[2] =>数字の3はスペイン語でtres(トレス)といいます。
[3] => 数字の4はスペイン語でクアトロ(cuatro)といいます。
[4] =>数字の5はスペイン語でcinco(シンコ)といいます。
)

// $dのプリントアウト
配列
(
[0] => 配列
(
[1] => ウノ
)

    [1] => 配列
(
[2] => ドス
)

    [2] => 配列
(
[3] => トレス
)

    [3] => 配列
(
[4] => クアトロ
)

    [4] => 配列
(
[5] => シンコ
)

詳細については、以下の公式ドキュメントを参照してください。 http://php.net/manual/zh/function.array-map.php

配列_フィルタ

* array_filter - コールバック関数で配列のセルにフィルタをかける *。
1. コールバック関数に配列の各値を順番に渡します。コールバック関数が true を返した場合、配列アレイの現在の値が返される結果配列に含まれます。配列のキー名は変更されません。
コールバック関数が提供されない場合、配列内の等価値が FALSE であるすべてのエントリが削除される。
3. ARRAY_FILTER_USE_KEY - コールバックはキー名のみを引数として受け取ります。ARRAY_FILTER_USE_BOTH - コールバックはキー名とキー値の両方を受け取ります。

例1:

<?php
function odd($var)
{
    // returns whether the input integer is odd
    return($var & 1);
}

function even($var)
{
    // returns whether the input integer is even
    return(! ($var & 1));
}

$array1 = array("a"=>1, "b"=>2, "c"=>3, "d"=>4, "e"=>5);
$array2 = array(6, 7, 8, 9, 10, 11, 12);

echo "Odd :\n";
print_r(array_filter($array1, "\d"));
echo "Even:\n";
print_r(array_filter($array2, "even"));
? >

//実行結果
奇数:
アレイ
(
[a] => 1
[c] => 3
[e] => 5
)
さえも。
アレイ
(
[0] => 6
[2] => 8
[4] => 10
[6] => 12 

例2.

<?php

$entry = array(
             0 => 'foo',
             1 => false,
             2 => -1,
             3 => null,
             4 => ''
          );

print_r(array_filter($entry));
? >

//実行結果

配列

(

    [0] => foo

    [2] => -1

)

例3.

<?php

$arr = ['a' => 1, 'b' => 2, 'c' => 3, 'd' => 4];

var_dump(array_filter($arr, function($k) {
    return $k == 'b';
}, ARRAY_FILTER_USE_KEY));

var_dump(array_filter($arr, function($v, $k) {
    return $k == 'b' || $v == 4;
}, ARRAY_FILTER_USE_BOTH));
? >


//実行結果

array(1) {

  ["b"]=>

  int(2)

}

array(2) {

  ["b"]=>

  int(2)

  ["d"]=>

  int(4)

)

詳細については、以下の公式ドキュメントを参照してください。 http://php.net/manual/zh/function.array-filter.php

他のリンクを参照してください。 https://www.jb51.net/article/222535.htm <リンク

phpのarray_walkのarray_mapのarray_filterの違いの場合についてのこの記事はこれに導入され、より関連するphpのarray_walkのarray_mapのarray_filterの違いの内容はスクリプト家の前の記事を検索するか、次の関連記事を閲覧し続けてくださいあなたは将来的に多くなることを願っています!... 今後ともよろしくお願いいたします。