分享一個函數,求bug,求改進^_^

來源:互聯網
上載者:User
我們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);}

又想起了那句著名的話:重複造輪子的人呐

不是很明白函數的意思,不過還是進來看看

又想起了那句著名的話:重複造輪子的人呐



前人的輪子不好,咱就努力造個更好的,即便實際做出來很糟糕,這也是造出更好輪子的第一步~你說呢

造輪子沒有什麼不好,選好材料和工藝才能事半功倍

  • 聯繫我們

    該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

    如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

    A Free Trial That Lets You Build Big!

    Start building with 50+ products and up to 12 months usage for Elastic Compute Service

    • Sales Support

      1 on 1 presale consultation

    • After-Sales Support

      24/7 Technical Support 6 Free Tickets per Quarter Faster Response

    • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.