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语法(3)
Oct 09 PHP
使用 MySQL 开始 PHP 会话
Dec 21 PHP
php中导出数据到excel时数字变为科学计数的解决方法
Feb 03 PHP
php获取表单中多个同名input元素的值
Mar 20 PHP
ThinkPHP 404页面的设置方法
Jan 14 PHP
PHP中session跨子域的三种实现方法
Jul 25 PHP
PHP7多线程搭建教程
Apr 21 PHP
PHP开发的文字水印,缩略图,图片水印实现类与用法示例
Apr 12 PHP
thinkphp5.1框架容器与依赖注入实例分析
Jul 23 PHP
php设计模式之建造器模式分析【星际争霸游戏案例】
Jan 23 PHP
thinkphp框架表单数组实现图片批量上传功能示例
Apr 04 PHP
MacOS下PHP7.1升级到PHP7.4.15的方法
Feb 22 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获取某个目录大小的代码
2008/09/10 PHP
php简单浏览目录内容的实现代码
2013/06/07 PHP
详解WordPress开发中用于获取分类及子页面的函数用法
2016/01/08 PHP
PHP结合Ffmpeg快速搭建流媒体服务的实践记录
2018/10/31 PHP
laravel csrf排除路由,禁止,关闭指定路由的例子
2019/10/21 PHP
常见的5个PHP编码小陋习以及优化实例讲解
2021/02/27 PHP
用showModalDialog弹出页面后,提交表单总是弹出一个新窗口
2009/07/18 Javascript
Jsonp 跨域的原理以及Jquery的解决方案
2010/05/18 Javascript
Javascript下IE与Firefox下的差异兼容写法总结
2010/06/18 Javascript
javascript抖动元素的小例子
2013/10/28 Javascript
MyEclipse取消验证Js的两种方法
2013/11/14 Javascript
jquery动态更换设置背景图的方法
2014/03/25 Javascript
javascript设计模式Constructor(构造器)模式
2016/08/19 Javascript
微信小程序实战之轮播图(3)
2017/04/17 Javascript
JavaScript判断输入是否为数字类型的方法总结
2017/09/28 Javascript
Bootstrap Table 双击、单击行获取该行及全表内容
2018/08/31 Javascript
vue基础之事件简写、事件对象、冒泡、默认行为、键盘事件实例分析
2019/03/11 Javascript
详解vue-cli+element-ui树形表格(多级表格折腾小计)
2019/04/17 Javascript
VSCode launch.json配置详细教程
2020/06/18 Javascript
python实现的防DDoS脚本
2011/02/08 Python
基于Python实现文件大小输出
2016/01/11 Python
Python实现的破解字符串找茬游戏算法示例
2017/09/25 Python
基于tensorflow加载部分层的方法
2018/07/26 Python
Python访问MongoDB,并且转换成Dataframe的方法
2018/10/15 Python
Python pip替换为阿里源的方法步骤
2019/07/02 Python
简单介绍python封装的基本知识
2019/08/10 Python
pandas实现导出数据的四种方式
2020/12/13 Python
Belvilla德国:在线预订度假屋
2018/04/10 全球购物
办公设备采购方案
2014/03/16 职场文书
转让协议书范本
2014/09/13 职场文书
2014年公路养护工作总结
2014/12/04 职场文书
2015年调度员工作总结
2015/04/30 职场文书
有关朝花夕拾的读书笔记
2015/06/29 职场文书
找规律教学反思
2016/02/23 职场文书
2016年“我们的节日·中秋节”活动总结
2016/04/05 职场文书
合理缓解职场压力,让你随时保持最佳状态!
2019/06/21 职场文书