我們phper經常會用到很多對數字或字串的處理函數
遺憾的是大部分都不支援數組
靈光一閃,搞定它
覺得有用的大大們捧個場
順便找些bug並給些改進的建議
/** * 通過遞迴調用讓函數支援多維陣列 by wanderwind * 建議其他函數調用來實現 * @param string $fn 調用函數名稱 * @param array $param 參數數組,通常傳入func_get_args() * @param int $key 需要遞迴的參數索引值 * @param boolean $check 是否需要檢測函數合法性 * @return mixed 返回對$param[$key]的運行結果 */function fn2array($fn, $param, $key = 0, $check = true) { //從外部調用時預設檢測函數合法性,多維陣列遞迴時忽略 if ($check && !function_exists($fn)) { return false; } //提取執行目標,如果目標非數組可以直接執行 $content = $param[$key]; if (!is_array($content)) { return call_user_func_array($fn, $param); } //如果目標是數組則遞迴執行 foreach ($content as &$val) { $param[$key] = $val; $val = fn2array($fn, $param, $key, false); } return $content;}function wstripslashes() { return fn2array('stripslashes', func_get_args());}function wsubstr() { $param = func_get_args(); $param[3] = isset($param[3]) ? $param[3] : 'utf-8'; return fn2array('mb_substr', $param, 0);}$a = array( 2 => '\"aaaaaaaaaaaaaaa\"', array('\"啊啊啊啊啊啊啊啊啊啊啊啊啊\"'), array(array(array('\"sss\dasf\dasfasdsad\"'))),);print_r(wstripslashes($a));print_r(wsubstr($a, 2, 5));
回複討論(解決方案)
發完文章想到一個改進方向,例如我們經常從資料庫篩選出一個結果集數組,可能需要單獨對某幾個欄位過濾
例如對title和content單獨進行stripslashes
介面可以設計為 wstripslashes($data, 'title,content')
這樣的話需要多一步對索引值的判定
您忘了 php 的 array_walk_recursive 函數
您忘了 php 的 array_walk_recursive 函數
確實有個不愛看手冊的壞毛病
但是剛剛翻了一下,我粗淺的覺得這個函數可能無法滿足需求
1,如何支援多維陣列?
2,如何用它遞迴iconv('gbk', 'utf-8', $str)這種函數?
因為沒使用過這個函數,可能需要麻煩斑竹寫個樣本
$ar = array( array('漢字'), array('漢字'), array( array('漢字'), array('漢字'), array( array('漢字'), array('漢字'), ), ),);function zm(&$v, $k, $charset) { $v = iconv($charset[0], $charset[1], $v);}array_walk_recursive($ar, 'zm', array('gbk', 'utf-8'));print_r($ar);
??支援下。
$ar = array( array('漢字'), array('漢字'), array( array('漢字'), array('漢字'), array( array('漢字'), array('漢字'), ), ),);function zm(&$v, $k, $charset) { $v = iconv($charset[0], $charset[1], $v);}array_walk_recursive($ar, 'zm', array('gbk', 'utf-8'));print_r($ar);
感謝xu大,又學到東西了
用系統提供的函數或許效能會強一些
但結合開發體驗,我還是想支援自己的方法
array_walk_recursive對原資料是引用,而且參數傳遞方法比較死,如果想不汙染$ar,同時讓開發人員使用便利,就要再定義一個函數
function zm(&$v, $k, $charset) { $v = iconv($charset[0], $charset[1], $v);}function wiconv($in, $out, $content) { array_walk_recursive($content, 'zm', array($in, $out)); return $content;}
其實這樣的wiconv也不行,還要加入$content本身就是字串的判定條件~
我是希望有一種快速建立新函數,並且不改變原函數使用習慣的方法,貌似有點物件導向的繼承思想?
比如我的方法中 iconv可以這樣擴充:
function wiconv() { //2代表遞迴第三個參數是目標 return fn2array('iconv', func_get_args(), 2);}$ar = array('漢字', array(array('漢字')));print_r(wiconv('utf-8', 'gbk', $ar)); //不改變原函數使用習慣
您覺得呢
??支援下。
function wiconv($in_charset, $out_charset, $str) { if(is_array($str)) { array_walk_recursive($str, function(&$v, $k, $p) { $v = iconv($p[0], $p[1], $v); }, array($in_charset, $out_charset)); return $str; } return iconv($in_charset, $out_charset, $str);}
又想起了那句著名的話:重複造輪子的人呐
不是很明白函數的意思,不過還是進來看看
又想起了那句著名的話:重複造輪子的人呐
前人的輪子不好,咱就努力造個更好的,即便實際做出來很糟糕,這也是造出更好輪子的第一步~你說呢
造輪子沒有什麼不好,選好材料和工藝才能事半功倍