PHP实现的操作数组类库定义与用法示例


Posted in PHP onMay 24, 2019

本文实例讲述了PHP实现的操作数组类库定义与用法。分享给大家供大家参考,具体如下:

类库(完整类库):

<?php
class ArrayHelper{
  /**
   * 从数组中删除空白的元素(包括只有空白字符的元素)
   *
   * 用法:
   * @code php
   * $arr = array('', 'test', '  ');
   * ArrayHelper::removeEmpty($arr);
   *
   * dump($arr);
   *  // 输出结果中将只有 'test'
   * @endcode
   *
   * @param array $arr 要处理的数组
   * @param boolean $trim 是否对数组元素调用 trim 函数
   */
  static function removeEmpty(& $arr, $trim = TRUE)
  {
    foreach ($arr as $key => $value)
    {
      if (is_array($value))
      {
        self::removeEmpty($arr[$key]);
      }
      else
      {
        $value = trim($value);
        if ($value == '')
        {
          unset($arr[$key]);
        }
        elseif ($trim)
        {
          $arr[$key] = $value;
        }
      }
    }
  }
  /**
   * 从一个二维数组中返回指定键的所有值
   *
   * 用法:
   * @code php
   * $rows = array(
   *   array('id' => 1, 'value' => '1-1'),
   *   array('id' => 2, 'value' => '2-1'),
   * );
   * $values = ArrayHelper::getCols($rows, 'value');
   *
   * dump($values);
   *  // 输出结果为
   *  // array(
   *  //  '1-1',
   *  //  '2-1',
   *  // )
   * @endcode
   *
   * @param array $arr 数据源
   * @param string $col 要查询的键
   *
   * @return array 包含指定键所有值的数组
   */
  static function getCols($arr, $col)
  {
    $ret = array();
    foreach ($arr as $row)
    {
      if (isset($row[$col])) {
        $ret[] = $row[$col];
      }
    }
    return $ret;
  }
  /**
   * 将一个二维数组转换为 HashMap,并返回结果
   *
   * 用法1:
   * @code php
   * $rows = array(
   *   array('id' => 1, 'value' => '1-1'),
   *   array('id' => 2, 'value' => '2-1'),
   * );
   * $hashmap = ArrayHelper::toHashmap($rows, 'id', 'value');
   *
   * dump($hashmap);
   *  // 输出结果为
   *  // array(
   *  //  1 => '1-1',
   *  //  2 => '2-1',
   *  // )
   * @endcode
   *
   * 如果省略 $valueField 参数,则转换结果每一项为包含该项所有数据的数组。
   *
   * 用法2:
   * @code php
   * $rows = array(
   *   array('id' => 1, 'value' => '1-1'),
   *   array('id' => 2, 'value' => '2-1'),
   * );
   * $hashmap = ArrayHelper::toHashmap($rows, 'id');
   *
   * dump($hashmap);
   *  // 输出结果为
   *  // array(
   *  //  1 => array('id' => 1, 'value' => '1-1'),
   *  //  2 => array('id' => 2, 'value' => '2-1'),
   *  // )
   * @endcode
   *
   * @param array $arr 数据源
   * @param string $keyField 按照什么键的值进行转换
   * @param string $valueField 对应的键值
   *
   * @return array 转换后的 HashMap 样式数组
   */
  static function toHashmap($arr, $keyField, $valueField = NULL)
  {
    $ret = array();
    if ($valueField)
    {
      foreach ($arr as $row)
      {
        $ret[$row[$keyField]] = $row[$valueField];
      }
    }
    else
    {
      foreach ($arr as $row)
      {
        $ret[$row[$keyField]] = $row;
      }
    }
    return $ret;
  }
  /**
   * 将一个二维数组按照指定字段的值分组
   *
   * 用法:
   * @endcode
   *
   * @param array $arr 数据源
   * @param string $keyField 作为分组依据的键名
   *
   * @return array 分组后的结果
   */
  static function groupBy($arr, $keyField)
  {
    $ret = array();
    foreach ($arr as $row)
    {
      $key = $row[$keyField];
      $ret[$key][] = $row;
    }
    return $ret;
  }
  /**
   * 将一个平面的二维数组按照指定的字段转换为树状结构
   *
   *
   * 如果要获得任意节点为根的子树,可以使用 $refs 参数:
   * @code php
   * $refs = null;
   * $tree = ArrayHelper::tree($rows, 'id', 'parent', 'nodes', $refs);
   *
   * // 输出 id 为 3 的节点及其所有子节点
   * $id = 3;
   * dump($refs[$id]);
   * @endcode
   *
   * @param array $arr 数据源
   * @param string $keyNodeId 节点ID字段名
   * @param string $keyParentId 节点父ID字段名
   * @param string $keyChildrens 保存子节点的字段名
   * @param boolean $refs 是否在返回结果中包含节点引用
   *
   * return array 树形结构的数组
   */
  static function toTree($arr, $keyNodeId, $keyParentId = 'parent_id', $keyChildrens = 'childrens', & $refs = NULL)
  {
    $refs = array();
    foreach ($arr as $offset => $row)
    {
      $arr[$offset][$keyChildrens] = array();
      $refs[$row[$keyNodeId]] =& $arr[$offset];
    }
    $tree = array();
    foreach ($arr as $offset => $row)
    {
      $parentId = $row[$keyParentId];
      if ($parentId)
      {
        if (!isset($refs[$parentId]))
        {
          $tree[] =& $arr[$offset];
          continue;
        }
        $parent =& $refs[$parentId];
        $parent[$keyChildrens][] =& $arr[$offset];
      }
      else
      {
        $tree[] =& $arr[$offset];
      }
    }
    return $tree;
  }
  /**
   * 将树形数组展开为平面的数组
   *
   * 这个方法是 tree() 方法的逆向操作。
   *
   * @param array $tree 树形数组
   * @param string $keyChildrens 包含子节点的键名
   *
   * @return array 展开后的数组
   */
  static function treeToArray($tree, $keyChildrens = 'childrens')
  {
    $ret = array();
    if (isset($tree[$keyChildrens]) && is_array($tree[$keyChildrens]))
    {
      foreach ($tree[$keyChildrens] as $child)
      {
        $ret = array_merge($ret, self::treeToArray($child, $keyChildrens));
      }
      unset($node[$keyChildrens]);
      $ret[] = $tree;
    }
    else
    {
      $ret[] = $tree;
    }
    return $ret;
  }
  /**
   * 根据指定的键对数组排序
   *
   * @endcode
   *
   * @param array $array 要排序的数组
   * @param string $keyname 排序的键
   * @param int $dir 排序方向
   *
   * @return array 排序后的数组
   */
  static function sortByCol($array, $keyname, $dir = SORT_ASC)
  {
    return self::sortByMultiCols($array, array($keyname => $dir));
  }
  /**
   * 将一个二维数组按照多个列进行排序,类似 SQL 语句中的 ORDER BY
   *
   * 用法:
   * @code php
   * $rows = ArrayHelper::sortByMultiCols($rows, array(
   *   'parent' => SORT_ASC,
   *   'name' => SORT_DESC,
   * ));
   * @endcode
   *
   * @param array $rowset 要排序的数组
   * @param array $args 排序的键
   *
   * @return array 排序后的数组
   */
  static function sortByMultiCols($rowset, $args)
  {
    $sortArray = array();
    $sortRule = '';
    foreach ($args as $sortField => $sortDir)
    {
      foreach ($rowset as $offset => $row)
      {
        $sortArray[$sortField][$offset] = $row[$sortField];
      }
      $sortRule .= '$sortArray[\'\' . $sortField .\'\'], ' . $sortDir . ', ';
    }
    if (empty($sortArray) || empty($sortRule)) {
      return $rowset;
    }
    eval('array_multisort(' . $sortRule . '$rowset);');
    return $rowset;
  }
}
?>

用法示例:

从数组中删除空白的元素(包括只有空白字符的元素)

用法:

$arr = array('', 'test', '  ');
ArrayHelper::removeEmpty($arr);
var_dump($arr);

输出结果中将只有 'test'

array(1) {
  [1]=>
  string(4) "test"
}

希望本文所述对大家PHP程序设计有所帮助。

PHP 相关文章推荐
针对初学PHP者的疑难问答(1)
Oct 09 PHP
如何使用Linux的Crontab定时执行PHP脚本的方法
Dec 19 PHP
PHP面向对象的进阶学习(抽像类、接口、final、类常量)
May 07 PHP
PHP伪静态Rewrite设置之APACHE篇
Jul 30 PHP
PHP自定session保存路径及删除、注销与写入的方法
Nov 18 PHP
PHP计算加权平均数的方法
Jul 16 PHP
微信公众号开发之文本消息自动回复php代码
Aug 08 PHP
PHP后期静态绑定之self::限制实例分析
Dec 21 PHP
PHP封装类似thinkphp连贯操作数据库Db类与简单应用示例
May 08 PHP
php常用字符串查找函数strstr()与strpos()实例分析
Jun 21 PHP
Laravel框架实现即点即改功能的方法分析
Oct 31 PHP
详解Laravel服务容器的绑定与解析
Nov 05 PHP
定位地理位置PHP判断员工打卡签到经纬度是否在打卡之内
May 23 #PHP
Swoole4.4协程抢占式调度器详解
May 23 #PHP
PHP文件上传小程序 适合初学者学习!
May 23 #PHP
PHP观察者模式实例分析【对比JS观察者模式】
May 22 #PHP
PHP单例模式实例分析【防继承,防克隆操作】
May 22 #PHP
在Laravel5中正确设置文件权限的方法
May 22 #PHP
PHP 结合 Boostrap 结合 js 实现学生列表删除编辑及搜索功能
May 21 #PHP
You might like
php 高性能书写
2010/12/11 PHP
PHP设置Cookie的HTTPONLY属性方法
2017/02/09 PHP
鼠标经过的文本框textbox变色
2009/05/21 Javascript
JQuery 学习笔记01 JQuery初接触
2010/05/06 Javascript
jquery仅用6行代码实现滑动门效果
2015/09/07 Javascript
Bootstrap每天必学之轮播(Carousel)插件
2016/04/25 Javascript
详解Sea.js中Module.exports和exports的区别
2017/02/12 Javascript
vue子组件使用自定义事件向父组件传递数据
2017/05/27 Javascript
js html实现计算器功能
2018/11/13 Javascript
Nodejs中怎么实现函数的串行执行
2019/03/02 NodeJs
vue在自定义组件中使用v-model进行数据绑定的方法
2019/03/25 Javascript
vue使用video.js进行视频播放功能
2019/07/18 Javascript
基于layui table返回的值的多级嵌套的解决方法
2019/09/19 Javascript
JS实现TITLE悬停长久显示效果完整示例
2020/02/11 Javascript
node.js中module模块的功能理解与用法实例分析
2020/02/14 Javascript
es6中let和const的使用方法详解
2020/02/24 Javascript
js实现盒子滚动动画效果
2020/08/09 Javascript
Element-ui el-tree新增和删除节点后如何刷新tree的实例
2020/08/31 Javascript
Vue 打包的静态文件不能直接运行的原因及解决办法
2020/11/19 Vue.js
[46:21]Liquid vs LGD 2018国际邀请赛淘汰赛BO3 第一场 8.23
2018/08/24 DOTA
[45:18]完美世界DOTA2联赛循环赛 PXG vs IO 第二场 11.06
2020/11/09 DOTA
一个基于flask的web应用诞生 使用模板引擎和表单插件(2)
2017/04/11 Python
Python+matplotlib绘制不同大小和颜色散点图实例
2018/01/19 Python
numpy下的flatten()函数用法详解
2019/05/27 Python
Django rstful登陆认证并检查session是否过期代码实例
2019/08/13 Python
python 实现仿微信聊天时间格式化显示的代码
2020/04/17 Python
Python基于Faker假数据构造库
2020/11/30 Python
让IE6、IE7、IE8支持CSS3的脚本
2010/07/20 HTML / CSS
一款纯css3实现的鼠标悬停动画按钮
2014/12/29 HTML / CSS
HTML5 CSS3打造相册效果附源码下载
2014/06/16 HTML / CSS
美国战术品牌:5.11 Tactical
2019/05/01 全球购物
美国领先的个性化礼品商城:Personalization Mall
2019/07/27 全球购物
公司建议书怎么写
2014/05/15 职场文书
小学美术兴趣小组活动总结
2014/07/07 职场文书
二胎满月酒致辞
2015/07/29 职场文书
聘任书格式及范文
2015/09/21 职场文书