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程序
Oct 09 PHP
php数组对百万数据进行排除重复数据的实现代码
Jun 08 PHP
url decode problem 解决方法
Dec 26 PHP
php中使用preg_match_all匹配文章中的图片
Feb 06 PHP
PHP提示Cannot modify header information - headers already sent by解决方法
Sep 22 PHP
php实现多维数组中每个单元值(数字)翻倍的方法
Feb 16 PHP
yii2.0实现pathinfo的形式访问的配置方法
Apr 06 PHP
PHP Oauth授权和本地加密实现方法
Aug 12 PHP
关于php几种字符串连接的效率比较(详解)
Feb 22 PHP
PHP实现打包下载文件的方法示例
Oct 07 PHP
golang实现php里的serialize()和unserialize()序列和反序列方法详解
Oct 30 PHP
PHP实现微信小程序用户授权的工具类示例
Mar 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
解决dede生成静态页和动态页转换的一些问题,及火车采集入库生成动态的办法
2007/03/29 PHP
适用于php-5.2 的 php.ini 中文版[金步国翻译]
2011/04/17 PHP
php判断一个数组是否为有序的方法
2015/03/27 PHP
PHP IDE phpstorm 常用快捷键
2015/05/18 PHP
Prototype RegExp对象 学习
2009/07/19 Javascript
jquery控制listbox中项的移动并排序
2009/11/12 Javascript
js或css实现滚动广告的几种方案
2010/01/28 Javascript
网页上的Javascript编辑器和代码格式化
2010/04/25 Javascript
克隆javascript对象的三个方法小结
2011/01/12 Javascript
javascript 基础篇4 window对象,DOM
2012/03/14 Javascript
前台js改变Session的值(用ajax实现)
2012/12/28 Javascript
JS实现QQ图片一闪一闪的效果小例子
2013/07/31 Javascript
JS检测图片大小的实例
2013/08/21 Javascript
让网页跳转到指定位置的jquery代码非书签
2013/09/06 Javascript
js加载读取内容及显示与隐藏div示例
2014/02/13 Javascript
html5+javascript制作简易画板附图
2014/04/25 Javascript
JavaScript针对网页节点的增删改查用法实例
2015/02/02 Javascript
浅谈Javascript中substr和substring的区别
2015/09/30 Javascript
利用Node.js编写跨平台的spawn语句详解
2017/02/12 Javascript
vue mint-ui tabbar变组件使用
2018/05/04 Javascript
Vue props 单向数据流的实现
2018/11/06 Javascript
微信小程序实现底部弹出框
2020/11/18 Javascript
在python3环境下的Django中使用MySQL数据库的实例
2017/08/29 Python
django 常用orm操作详解
2017/09/13 Python
python代码实现ID3决策树算法
2017/12/20 Python
python 读取文件并替换字段的实例
2018/07/12 Python
pandas 数据归一化以及行删除例程的方法
2018/11/10 Python
python版本五子棋的实现代码
2018/12/11 Python
Django基础知识 web框架的本质详解
2019/07/18 Python
css3中检验表单的required,focus,valid和invalid样式
2014/02/21 HTML / CSS
HTML5中语义化 b 和 i 标签
2008/10/17 HTML / CSS
新西兰领先的内衣店:Bendon Lingerie新西兰
2018/07/11 全球购物
JBL加拿大官方商店:扬声器、耳机等
2020/10/23 全球购物
大学生职业生涯规划书汇总
2014/03/20 职场文书
青奥会口号
2014/06/12 职场文书
英国数字版游戏销量周榜公布 《小缇娜的奇幻之地》登顶
2022/04/03 其他游戏