分享一个函数,求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));
...全文
749 162 打赏 收藏 转发到动态 举报
AI 作业
写回复
用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
  • 打赏
  • 举报
回复
進來支持下。
(题外话:从本次开始 我新增了jQuery EasyUI的专题页面 大家可以关注我的专题页来及时获取最新的EasyUI资源 专题页地址如下http:http://download.csdn.net/album/detail/343 同时也希望转载的那些朋友能保留我资源的说明及出处地址 我花那么多精力制作出来的 你们鼠标点两下就给我转走了还不注明出处 实在是不厚道 本来就是本着分享精神的 为的就是聚集一点人气和提供一个优良的环境来一起学习进步的 请不要抹杀掉我的热情 谢谢 )   时隔4个月之久 EasyUI终于迎来大版本更新了 本次更新内容诸多 除了常规维护外 还新增了3个新组件 都很实用 详细的可以阅读更新说明 里面给了详细的解读 另外 从该版本开始我将会逐步的将EasyUI官方以及第三方较好的插件API整合到API文档当中 并且会对这些插件做一些简单的Demo实现 存放到配套提供的程序包demo文件夹下 以便大家学习和使用 本期文档中将官方提供的所有附加插件的API都整理并存放到Extension节点下了 这些扩展的demo在附带的程序包中已经提供 可以用于参考使用 jQuery EasyUI 1 4版本更新内容: Bug(修复) menu:修复在删除一个菜单项的时候该菜单无法正确自适应高度的问题; datagrid:修复在datagrid宽度太小的时候“fitColumns”方法无法正常工作的问题 Improvement(改进) EasyUI的所有组件已经支持非固定 百分比大小的尺寸设置; menu:添加“showItem” “hideItem”和“resize”方法; menu:基于窗体大小自动调整高度; menu:添加“duration”属性 该属性允许用户自定义隐藏菜单动画的持续时间 以毫秒为单位; validatebox:添加“onBeforeValidate”和“onValidate”事件; combo:从该版本开始combo组件扩展自textbox组件(textbox是1 4中新增的组件); combo:添加“panelMinWidth” “panelMaxWidth” “panelMinHeight”和“panelMaxHeight”属性; searchbox:从该版本开始searchbox组件扩展自textbox组件(textbox是1 4中新增的组件); tree:添加“getRoot”方法 用于返回通过“nodeEl”参数指定的节点的顶部父节点元素 注意:官网的英文API中该函数的说明有误 其说明是none 无参数 实际这里是需要参数的 ; tree:添加“queryParams”属性; datetimebox:添加“spinnerWidth”属性; panel:添加“doLayout”方法 用于控制面板内组件的大小; panel:添加“clear”方法 用于清除面板内的内容; datagrid:允许用户设置百分比宽度的列(该功能真是千呼万唤始出来啊 ); form:添加“ajax” “novalidate”和“queryParams”属性; linkbutton:添加“resize”方法 New Plugin(新组件) textbox:该组件是一个增强的输入字段 它可以让用户非常简单的构建一个表单; datetimespinner:该组件是一个日期和时间的微调组件 它允许我们选择一个特定的日期或时间; filebox:filebox 该组件表单元素中用于上传文件的文件框工具组件 ">(题外话:从本次开始 我新增了jQuery EasyUI的专题页面 大家可以关注我的专题页来及时获取

21,893

社区成员

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

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