1. 程式人生 > >array_map與array_walk的用法與區別詳解

array_map與array_walk的用法與區別詳解

一、背景

      今天看程式碼的時候,發現程式碼中使用array_map來統一去掉陣列中的空格,比起迴圈來,方便了很多。網上百度一下array_map,然後發現了array_walk。好吧,這兩個函式雖然在某些情境下有異曲同工之妙,但是區別還是很大的。

二、關於array_map

1、文件

      array_map() 函式將使用者自定義函式作用到陣列中的每個值上,並返回使用者自定義函式作用後的帶有新值的陣列。

回撥函式接受的引數數目應該和傳遞給 array_map() 函式的陣列數目一致。

http://www.w3school.com.cn/php/func_array_map.asp

大家看一下文件,就知道大概的用法了。

//這裡可以傳遞多個數組作為引數,與之對應的,myfunction()函式中也要有多個引數。是一一對應的關係
array_map(myfunction,array1,array2,array3...)

2、例子

  public function test_array_map(Request $request)
    {
      $aa = array('aa', 'bb');
      $bb = array_map(function($item) {
        $item = $item . 'aa' ;
        return $item;
      }, $aa);
      var_dump($aa);
      echo'<br/>';
      var_dump($bb);
    }
//結果
      array(2) { [0]=> string(2) "aa" [1]=> string(2) "bb" }
     array(2) { [0]=> string(4) "aaaa" [1]=> string(4) "bbaa" }

      此處可以看到,$bb是我們新返回的陣列,也是經過我們自己處理過的陣列。此時是不會影響到原陣列的。

三、array_walk

1、文件

      array_walk() 函式對陣列中的每個元素應用使用者自定義函式。在函式中,陣列的鍵名和鍵值是引數。
http://www.w3school.com.cn/php/func_array_walk.asp

用法:array_walk(array,myfunction,userdata…)

這裡的例子看文件就可以,比較清楚。需要注意的是該函式的返回值是bool值

2、例子:

  public function test_array_walk(Request $request)
  {
    $aa = array('aa', 'bb');
    $bb = array_walk($aa,function($item) {
      $item = $item . 'aa' ;
      return $item;
    });
    var_dump($aa);
    echo'<br/>';
    var_dump($bb);
    }
    //結果
    array(2) { [0]=> string(2) "aa" [1]=> string(2) "bb" }
	 bool(true)   

      這裡發現返回的值是bool值。如果想要輸出的話,就在函式中使用echo $item。這裡列印原陣列的值是不變的,如果要改變原陣列的值,則需要使用引用符號:

//這裡加了個引用
     $bb = array_walk($aa,function(&$item) {
          $item = $item . 'aa' ;
          return $item;
        });
        //其他不變列印結果(原陣列已經被改變)
        array(2) { [0]=> string(4) "aaaa" [1]=> string(4) "bbaa" }
		bool(true)

四、區別

1、array_map的用法是array_map(函式名,陣列),而array_walk的用法是array_walk(陣列,函式名);

2、array_map裡面的函式可以是自定義函式,也可以是php自帶的函式,比如trim去除空格等。而array_walk裡面的函式只能是自定義的函式

3、array_map不可以改變原函式的值,會獲取到新的陣列。array_walk是可以改變原函式的值的(加個引用)。

4、array_map必須要有返回值,因為要填充陣列。而array_walk可以沒有返回值,輸出的話要在呼叫的函式中通過echo來輸出。

      這兩個函式有個共同點就是可以簡化我們的程式碼,有些簡單的foreach迴圈替換功能,完全可以用這兩個函式來實現。記錄一下。

end