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 代码规范小结
Mar 08 PHP
php5.5新数组函数array_column使用
Jul 08 PHP
php递归创建目录的方法
Feb 02 PHP
php通过获取头信息判断图片类型的方法
Jun 26 PHP
使用php完成常见的文件上传功能(推荐)
Jan 13 PHP
PHP删除二维数组中相同元素及数组重复值的方法示例
May 05 PHP
PHP读取Excel类文件
May 15 PHP
PHP 中 var_export、print_r、var_dump 调试中的区别
Jun 19 PHP
PHP基于PDO扩展操作mysql数据库示例
Dec 24 PHP
php设计模式之装饰模式应用案例详解
Jun 17 PHP
Yii框架连表查询操作示例
Sep 06 PHP
php png失真的原因及解决办法
Nov 17 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
PHP4实际应用经验篇(3)
2006/10/09 PHP
使用PHP socke 向指定页面提交数据
2008/07/23 PHP
php修改时间格式的代码
2011/05/29 PHP
php验证session无效的解决方法
2014/11/04 PHP
PHP魔术方法__GET、__SET使用实例
2014/11/25 PHP
PHP准确取得服务器IP地址的方法
2015/06/02 PHP
Laravel相关的一些故障解决
2020/08/19 PHP
JavaScript面象对象设计
2008/04/28 Javascript
js数组Array sort方法使用深入分析
2013/02/21 Javascript
Javascript核心读书有感之语句
2015/02/11 Javascript
AngularJS使用ng-app自动加载bootstrap框架问题分析
2017/01/04 Javascript
js判断PC端与移动端跳转
2020/12/24 Javascript
js模仿微信朋友圈计算时间显示几天/几小时/几分钟/几秒之前
2017/04/27 Javascript
文本溢出插件jquery.dotdotdot.js使用方法详解
2017/06/22 jQuery
Vue框架中正确引入JS库的方法介绍
2017/07/30 Javascript
node.js中使用Export和Import的方法
2017/09/18 Javascript
详解vue-meta如何让你更优雅的管理头部标签
2018/01/18 Javascript
图文介绍Vue父组件向子组件传值
2018/02/17 Javascript
vue router+vuex实现首页登录验证判断逻辑
2018/05/17 Javascript
微信小程序冒泡事件及其阻止方法实例分析
2018/12/06 Javascript
vue刷新页面时去闪烁提升用户体验效果的实现方法
2018/12/10 Javascript
小程序使用wxs解决wxml保留2位小数问题
2019/12/13 Javascript
解决Vue使用bus总线时,第一次路由跳转时数据没成功传递问题
2020/07/28 Javascript
JS highcharts动态柱状图原理及实现
2020/10/16 Javascript
python中将阿拉伯数字转换成中文的实现代码
2011/05/19 Python
c++生成dll使用python调用dll的方法
2014/01/20 Python
Python 元组(Tuple)操作详解
2014/03/11 Python
python:按行读入,排序然后输出的方法
2019/07/20 Python
matplotlib实现显示伪彩色图像及色度条
2019/12/07 Python
Hotels.com台湾:饭店订房网
2017/09/06 全球购物
Club Monaco加拿大官网:设计师男女服装
2019/09/29 全球购物
2014年人事科工作总结
2014/11/19 职场文书
2014年预算员工作总结
2014/12/05 职场文书
店铺转让协议书
2015/01/29 职场文书
天河观后感
2015/06/11 职场文书
Python使用openpyxl模块处理Excel文件
2022/06/05 Python