ホームページ  >  記事  >  バックエンド開発  >  コールバック関数と配列

コールバック関数と配列

不言
不言オリジナル
2018-04-14 16:37:181819ブラウズ

この記事で共有する内容は、PHP コールバック関数と配列に関するもので、必要な場合は、

array_filter()、array_map()、array_reduce()、array_walk() の使用法の比較を参照してください。

array_filterコールバック関数を使用して配列内のセルをフィルタリングします

説明: array array_filter ( 配列 $array$array [, callable $callback [, int $flag [, 呼び出し可能 $callback

[, 🎜🎜🎜int🎜 $flag 🎜 = 0🎜🎜🎜 ]] )🎜🎜🎜

依次将 配列array 数组中的每个值传递到 callback 函数。如果 callback 函数返回 true,则 array 数グループの中の每个值传递到 コールバック 関数。結果 コールバック
関数数戻り true,则
配列
数组的当前值会返される結果の数値グループに値が含まれている場合、その結果の数値グループは返されません。

パラメーターの説明:

配列: 要循環の数グループ

コールバック:使用される回调関数

如果没有提供 コールバックcallback 函数, 将删除 array 中所有等值为 FALSE 的条目。

flag:决定callback接收的参数形式 

  • ARRAY_FILTER_USE_KEY - callback 関数数,将删除 配列

    中全部等值です 🎜FALSE🎜 の条項。 コールバック🎜受信のパラメータ形式
    🎜🎜🎜🎜🎜🎜
    • 🎜ARRAY_FILTER_USE_KEY - コールバック受け入れ键名作の唯一のパラメータ🎜🎜
    • ARRAY_FILTER_USE_BOTH - callbackキー名とキー値の両方を受け入れます

    戻り値: フィルターされた配列を返します。

    例1:

    function odd($var){    return($var & 1);}function even($var){    
    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, "odd"));
    echo "<br />Even:\n";
    print_r(array_filter($array2, "even"));
    结果:Odd : Array ( [a] => 1 [c] => 3 [e] => 5 ) 
    Even: Array ( [0] => 6 [2] => 8 [4] => 10 [6] => 12 )

    分析: & は、バイナリ形式に従って配列内の値が渡される場合、...0000 0001 (先頭に0が何個あるか) 理解できない場合は、基礎知識を入力してください)を実行し、結果がtrueの場合、渡された値が返されます。結果の配列。

    例2: コールバック関数がない場合、配列の値がtrueの場合、配列の値が結果の配列に返されます

    $entry = array(    0 => 'foo',    1 => false,    2 => -1,    3 => null,    4 => '');
    print_r(array_filter($entry));
    结果:Array ( [0] => foo [2] => -1 )

    例3:キー値のみがある場合、コールバック関数はキー値を受け取ることができます。両方のキーと値のペアが含まれている場合、最初のパラメーターは値を受け取り、2 番目のパラメーターはキーと値を受け取ります

    $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));
    结果:
    D:\studySoftware\wamp64\www\test.php:
    5:array (size=1)  'b' => int 2D:
    \studySoftware\wamp64\www\test.php:
    8:array (size=2)  'b' => int 2  'd' => int 4
    array_map — 为数组的每个元素应用回调函数

    说明:array array_map ( callable $callback , array $array1 [, array $... ] )

    array_map():返回数组は、array1array1 每个元素应用 callback函数之后的数组。 callback 函数形参的数量和传给 array_map() 数组数量,两者必须一样。

    参数说明:

    callback回调函数,应用到每个数组里的每个元素。

    array1数组,遍历运行 callback 每个元素应用 コールバック関数数後の数集合。

    コールバック🎜 関数数形パラメータの数和传🎜🎜🎜array_map()🎜🎜🎜の数、双方が必要です。 🎜
    🎜🎜🎜パラメータ説明:🎜🎜コールバック🎜:🎜関数を各数値グループに適用する各要素。🎜🎜🎜array1🎜:🎜数组,遍历运行 🎜コールバック🎜 関数。🎜🎜

    ...数组列表,每个都遍历运行 callback 函数。

    返回值:返回数组,包含 callback 函数处理之后 array1 的所有元素。

    例1:

    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:如果几个数组的元素数量不一致:空元素(null)会扩展短那个数组,直到长度和最长的数组一样。

    function cube($n,$x){    
    echo "n的值:{$n},x的值:{$x}<br />";    
    return ($n + $x);}$a = array(1,2,3,4,5);
    $b = array(10,20);
    $c = array_map("cube",$a,$b);
    print_r($c);
    /*
    结果:
    n的值:
    1,x的值:10n的值:
    2,x的值:20n的值:
    3,x的值:n的值:
    4,x的值:n的值:
    5,x的值:Array ( [0] => 11 [1] => 22 [2] => 3 [3] => 4 [4] => 5 ) 
    */

    例3:此函数有个有趣的用法:传入 NULL 作为回调函数的名称,将创建多维数组(一个数组,内部包含数组。)

    $a = array(1, 2, 3);
    $b = array("one", "two", "three");
    $c = array("uno", "dos", "tres");
    $d = array_map(null, $a, $b, $c);
    echo "<pre class="brush:php;toolbar:false">";
    print_r($d);
    echo "
    ";

    结果如下:


    例4:如果仅传入一个数组,键(key)会保留;传入多个数组,键(key)是整型数字的序列。

    $arr = array("stringkey" => "value");
    function cb1($a) {    
    return array ($a);
    }function cb2($a, $b) {    
    return array ($a, $b);
    }var_dump(array_map("cb1", $arr));
    var_dump(array_map("cb2", $arr, $arr));
    var_dump(array_map(null,  $arr));
    var_dump(array_map(null, $arr, $arr));

    结果如下:

    array_reduceコールバック関数を使用して、配列を単一の値に反復的に削減します

    説明: mixed array_reduce (配列 $array$array , callable $callback [, mixed $initial = NULLcallable $callback [,

    🎜mixed🎜 $initialコード ><span class="initializer" style="color:#993366;"> = <strong style="font-weight:bolder;font-style:normal;"><code style="font-style:normal; font -variant:normal;font-weight:400;font-family:'Fira Mono'、'Source Code Pro'、monospace;color:rgb(153,51,102);margin:0px;">NULL🎜 🎜 🎜🎜 ] )🎜🎜

    array_reduce()はコールバック関数コールバックcallback 迭代地作用到 arrayarray により、配列が単一の値に減ります。

    パラメータ:

    array: 入力配列。

    🎜

    コールバック混合 コールバック ( 混合 $carry$carry , mixed $item )

           carry:携带上次迭代里的值; 如果本次迭代是第一次,那么这个值是 initial ,
    mixed
    $item

    )🎜🎜🎜🎜🎜🎜 🎜carry: 🎜最後の反復の値を運びます。この反復が初めての場合、この値は 🎜初期🎜。 🎜🎜🎜🎜🎜🎜

    item: はこの反復の値を運びます。

    initial: オプションのパラメータ initial が指定されている場合、このパラメータは処理が開始される前、または処理が終了して配列が最後の結果に対して空になったとき (つまり、パラメータarrayが空の場合、array_reduce())の戻り値としてinitialが使用されます。

    官网例子:

    function sum($carry, $item){    
    $carry += $item;    
    return $carry;
    }
    function product($carry, $item){    
    $carry *= $item;    
    return $carry;
    }
    $a = array(1, 2, 3, 4, 5);
    $x = array();
    var_dump(array_reduce($a, "sum")); 
    // int(15)var_dump(array_reduce($a, "product", 10)); 
    // int(1200), because: 10*1*2*3*4*5var_dump(array_reduce($x, "sum", "No data to reduce")); 
    // string(17) "No data to reduce"

    这里讨论array为空的情况:

    function sum($carry, $item){    
    echo "如果这里执行了,就打印...";    
    return $carry;}$x = array();
    print_r(array_reduce($x, "sum",array("a","b")));
    //结果:
    Array ( [0] => a [1] => b )

    可以看出,当数组为空的时候,回调函数根本就没有执行,而是把initial作为array_reduce返回值


    array_walk — 使用用户自定义函数对数组中的每个元素做回调处理

    说明:bool array_walk ( array &$array&$array , callable $callback [, mixed $userdata = NULL ] )

    将用户自定义函数 funcname 应用到 array ,
    callable
    $callback

    🎜 [, 🎜🎜🎜混合🎜 $userdata = NULL🎜🎜🎜 ] )🎜🎜🎜

    🎜🎜将用户自定関数数 🎜関数名🎜 应用到 🎜配列🎜 数グループ内の各要素。

    array_walk()array内部配列ポインタの影響を受けません。 array_walk()は、ポインタの位置に関係なく、配列全体を走査します。

    パラメータの説明:

    array: 入力配列。

    コールバック: 通常、コールバックcallback 接受两个参数。array 参数的值作为第一个,键名作为第二个

    Note:

    如果 callback 需要直接作用于数组中的值,则给 callbackは 2 つのパラメータを受け入れます。

    配列

    パラメータの値が最初のパラメータとして使用され、キー名が2番目のパラメータとして使用されます

    🎜🎜🎜🎜注🎜:🎜

    If コールバックは配列内の値に直接作用する必要があり、その後、コールバック code> の最初のパラメータは参照として指定されます。これらのセルを変更すると、元の配列自体も変更されます。 🎜🎜🎜🎜🎜🎜🎜🎜🎜🎜🎜注🎜:🎜<p class="para" style="margin:0px;color:rgb(51,51,51);font-family:'Fira Sans', 'Source Sans Pro', Helvetica, Arial, sans-serif;font-size:16px;font-style:normal;font-weight:400;letter-spacing:normal;text-indent:0px;text-transform:none;white-space:normal;word-spacing:0px;">パラメータの数が想定を超えた場合、組み込み関数(<span class="function">strto lower()</span>など)に渡すと警告がスローされるため、<code class="parameter" font-weight:700 mono code pro monospace>関数名funcname


    只有 arrayのみ 配列 の値のみを変更できます。ユーザーはコールバック関数で配列自体の構造を変更しないでください。たとえば、ユニットの追加/削除、ユニットの設定解除などです。

    array_walk()
    の対象となる配列が変更された場合、この関数の動作は未定義で予測できません。

    🎜🎜🎜🎜🎜🎜

    userdata: オプションのパラメータが指定されている場合 ユーザーデータuserdata,将被作为第三个参数传递给 callback funcname、3 番目のパラメータとしてコールバックに渡されます 関数名


    🎜

    返回值:成功时返回 TRUE, 或者在失败时返回 FALSE


    例子:

    $fruits = array("d" => "lemon", "a" => "orange", "b" => "banana");
    function test_alter(&$item1, $key, $prefix){    
    echo "$item1=$key=$prefix<br/>";   
    $item1 = "$prefix: $item1";
    }function test_print($item2, $key){   
     echo "$key. $item2<br />\n";}echo "Before ...:<br />";
     array_walk($fruits, 'test_print');array_walk($fruits, 'test_alter', 'fruit');echo "... and after:<br />";
     array_walk($fruits, 'test_print');
     /*
     Before ...:
     d. lemona. orange
     b. bananalemon=d=fruitorange=a=fruitbanana=b=fruit... and after:
     d. fruit: 
     lemona. fruit: 
     orangeb. fruit: 
     banana
     */


               

以上がコールバック関数と配列の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。