有這麼一個需求,一個數組$data = array(12, 43, 87, 45),要求寫一個自定義函數,將其數組元素的數字單個拆開,最後形成的數組如下:$data = array(1, 2, 4, 3, 8, 7, 4, 5)。就是把原來的數組中的數都“拆”成“單”位的。
下面是自己寫的一個函數:
function splitStrToArray_mine($array) { $new_array = array(); foreach($array as $value) { $value = (string)$value; $len = strlen($value); for($i = 0; $i < $len; $i ++){ array_push($new_array, $value{$i}); } } return $new_array; }
測試了一下,還是可以執行的,如下調用:
//測試數組 $data = array(12, 43, 87, 45, 98, 74, 83, 67, 12); var_dump(splitStrToArray_mine($data));
輸出結果為:
array(18) { [0]=> string(1) "1" [1]=> string(1) "2" [2]=> string(1) "4" [3]=> string(1) "3" [4]=> string(1) "8" [5]=> string(1) "7" [6]=> string(1) "4" [7]=> string(1) "5" [8]=> string(1) "9" [9]=> string(1) "8" [10]=> string(1) "7" [11]=> string(1) "4" [12]=> string(1) "8" [13]=> string(1) "3" [14]=> string(1) "6" [15]=> string(1) "7" [16]=> string(1) "1" [17]=> string(1) "2" }
雖然執行的不錯,但是看看標准答案就會讓你大吃一驚的,函數中就一句話,如下:
//標准函數 function splitStrToArray($array) { return str_split(implode("", $array)); }
於是寫了腳本來測試自己的和標准的函數的運行效率差距,裡面有一個 microtime_float() 函數用來提供精確時間的支持:
//測量時間的函數 function microtime_float() { list($usec, $sec) = explode(" ", microtime()); return ((float)$usec + (float)$sec); } //自定義函數 function splitStrToArray_mine($array) { $new_array = array(); foreach($array as $value) { $value = (string)$value; $len = strlen($value); for($i = 0; $i < $len; $i ++){ array_push($new_array, $value{$i}); } } return $new_array; } //標准函數 function splitStrToArray($array) { return str_split(implode("", $array)); } //測試數組 $data = array(12, 43, 87, 45, 98, 74, 83, 67, 12); //開始測試 $mine_start = microtime_float(); splitStrToArray_mine($data); $mine_end = microtime_float(); //標准函數調用 $sta_start = microtime_float(); splitStrToArray($data); $sta_end = microtime_float(); echo "自己的函數調用運行時間為:" . (float)($mine_end - $mine_start) . " S <br />"; echo "標准的函數調用運行時間為:" . (float)($sta_end - $sta_start) . " S <br />"; $multiple = (int)((float)($mine_end - $mine_start) / (float)($sta_end - $sta_start)); echo "前者是後者的:" . $multiple . " 倍!";
來看看輸出結果:
自己的函數調用運行時間為:9.3936920166E-005 S 標准的函數調用運行時間為:2.69412994385E-005 S 前者是後者的:3 倍!
多次刷新頁面的話,可以發現標准函數的執行效率基本上是自己的函數的 3 倍!當然,標准的函數中使用了 PHP 的內置函數: str_split(),implode(),所以要比自己寫函數快得多,對 str_split() 函數沒有印象?來看看手冊解釋:
str_split -- Convert a string to an array(將一個字符串轉換成數組)
函數描述:
array str_split ( string string [, int split_length] )
Converts a string to an array. If the optional split_length parameter is specified, the returned array will be broken down into chunks with each being split_length in length, otherwise each chunk will be one character in length.
FALSE is returned if split_length is less than 1. If the split_length length exceeds the length of string, the entire string is returned as the first (and only) array element.
例 1. Example uses of str_split()
<?php $str = "Hello Friend"; $arr1 = str_split($str); $arr2 = str_split($str, 3); print_r($arr1); print_r($arr2); ?>
程序運行結果:
Array ( [0] => H [1] => e [2] => l [3] => l [4] => o [5] => [6] => F [7] => r [8] => i [9] => e [10] => n [11] => d ) Array ( [0] => Hel [1] => lo [2] => Fri [3] => end )