0

0

php针对数组的删除、转换、分组、排序

墨辰丷

墨辰丷

发布时间:2018-06-08 17:27:19

|

1769人浏览过

|

来源于php中文网

原创

本篇文章主要介绍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;
  }
}

总结:以上就是本篇文的全部内容,希望能对大家的学习有所帮助。

相关推荐:

立即学习PHP免费学习笔记(深入)”;

瑞志企业建站系统(ASP版)2.2
瑞志企业建站系统(ASP版)2.2

支持模板化设计,基于标签调用数据 支持N国语言,并能根据客户端自动识别当前语言 支持扩展现有的分类类型,并可修改当前主要分类的字段 支持静态化和伪静态 会员管理功能,询价、订单、收藏、短消息功能 基于组的管理员权限设置 支持在线新建、修改、删除模板 支持在线管理上传文件 使用最新的CKEditor作为后台可视化编辑器 支持无限级分类及分类的移动、合并、排序 专题管理、自定义模块管理 支持缩略图和图

下载

PHP 实现的将图片转换为ASCII码

PHP通过禁止IP频繁访问防止网站被防攻击

PHP+Mysql+jQuery统计当前在线用户数

相关文章

PHP速学教程(入门到精通)
PHP速学教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

php

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
c++ 根号
c++ 根号

本专题整合了c++根号相关教程,阅读专题下面的文章了解更多详细内容。

22

2026.01.23

c++空格相关教程合集
c++空格相关教程合集

本专题整合了c++空格相关教程,阅读专题下面的文章了解更多详细内容。

24

2026.01.23

yy漫画官方登录入口地址合集
yy漫画官方登录入口地址合集

本专题整合了yy漫画入口相关合集,阅读专题下面的文章了解更多详细内容。

99

2026.01.23

漫蛙最新入口地址汇总2026
漫蛙最新入口地址汇总2026

本专题整合了漫蛙最新入口地址大全,阅读专题下面的文章了解更多详细内容。

132

2026.01.23

C++ 高级模板编程与元编程
C++ 高级模板编程与元编程

本专题深入讲解 C++ 中的高级模板编程与元编程技术,涵盖模板特化、SFINAE、模板递归、类型萃取、编译时常量与计算、C++17 的折叠表达式与变长模板参数等。通过多个实际示例,帮助开发者掌握 如何利用 C++ 模板机制编写高效、可扩展的通用代码,并提升代码的灵活性与性能。

15

2026.01.23

php远程文件教程合集
php远程文件教程合集

本专题整合了php远程文件相关教程,阅读专题下面的文章了解更多详细内容。

65

2026.01.22

PHP后端开发相关内容汇总
PHP后端开发相关内容汇总

本专题整合了PHP后端开发相关内容,阅读专题下面的文章了解更多详细内容。

61

2026.01.22

php会话教程合集
php会话教程合集

本专题整合了php会话教程相关合集,阅读专题下面的文章了解更多详细内容。

63

2026.01.22

宝塔PHP8.4相关教程汇总
宝塔PHP8.4相关教程汇总

本专题整合了宝塔PHP8.4相关教程,阅读专题下面的文章了解更多详细内容。

33

2026.01.22

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
PHP课程
PHP课程

共137课时 | 9.2万人学习

JavaScript ES5基础线上课程教学
JavaScript ES5基础线上课程教学

共6课时 | 10.3万人学习

PHP新手语法线上课程教学
PHP新手语法线上课程教学

共13课时 | 0.9万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号