分享一个函数,求bug,求改进^_^

智商众筹 2014-11-19 10:21:08
我们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));
...全文
828 162 打赏 收藏 转发到动态 举报
写回复
用AI写文章
162 条回复
切换为时间正序
请发表友善的回复…
发表回复
NewBePHP 2015-02-12
  • 打赏
  • 举报
回复
“vAAspzdphp比fzwhYpETVaPHP和xJYDghiOPHP强636个等级左右”,你不理解,我可以解释给你:
1、运行速度,至少是以上2种语言的549倍左右
2、开发速度:也至少是以上2种语言的837倍左右。
3、开源学习资源:tzqm框架比rXFRcsAH框架强742倍不止。比iwAHmHqEPHP强354倍不止。
4、语言简洁和强大性:WYXwPphp比它们2个强大514倍不止。
NewBeePHP 2015-02-12
  • 打赏
  • 举报
回复
支持楼主
NewBeePHP 2015-02-12
  • 打赏
  • 举报
回复
支持楼主
potency 2015-01-31
  • 打赏
  • 举报
回复
版主的水平我是很佩服的.... but....
xuzuning 2014-11-27
  • 打赏
  • 举报
回复
造轮子没有什么不好,选好材料和工艺才能事半功倍
智商众筹 2014-11-27
  • 打赏
  • 举报
回复
引用 10 楼 wuxing2722 的回复:
又想起了那句著名的话:重复造轮子的人呐
前人的轮子不好,咱就努力造个更好的,即便实际做出来很糟糕,这也是造出更好轮子的第一步~你说呢
天涯过客009 2014-11-26
  • 打赏
  • 举报
回复
不是很明白函数的意思,不过还是进来看看
真中传人 2014-11-26
  • 打赏
  • 举报
回复
又想起了那句著名的话:重复造轮子的人呐
智商众筹 2014-11-21
  • 打赏
  • 举报
回复
xuzuning 2014-11-19
  • 打赏
  • 举报
回复
$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);
智商众筹 2014-11-19
  • 打赏
  • 举报
回复
引用 2 楼 xuzuning 的回复:
您忘了 php 的 array_walk_recursive 函数
确实有个不爱看手册的坏毛病 但是刚刚翻了一下,我粗浅的觉得这个函数可能无法满足需求 1,如何支持多维数组? 2,如何用它递归iconv('gbk', 'utf-8', $str)这种函数? 因为没使用过这个函数,可能需要麻烦斑竹写个示例
xuzuning 2014-11-19
  • 打赏
  • 举报
回复
您忘了 php 的 array_walk_recursive 函数
智商众筹 2014-11-19
  • 打赏
  • 举报
回复
发完帖子想到一个改进方向,例如我们经常从数据库筛选出一个结果集数组,可能需要单独对某几个字段过滤 例如对title和content单独进行stripslashes 接口可以设计为 wstripslashes($data, 'title,content') 这样的话需要多一步对键值的判定
xuzuning 2014-11-19
  • 打赏
  • 举报
回复
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);
}

智商众筹 2014-11-19
  • 打赏
  • 举报
回复
引用 5 楼 fdipzone 的回复:
進來支持下。
智商众筹 2014-11-19
  • 打赏
  • 举报
回复
引用 4 楼 xuzuning 的回复:
$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));    //不改变原函数使用习惯
您觉得呢
傲雪星枫 2014-11-19
  • 打赏
  • 举报
回复
進來支持下。

21,890

社区成员

发帖
与我相关
我的任务
社区描述
从PHP安装配置,PHP入门,PHP基础到PHP应用
社区管理员
  • 基础编程社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧