菜鸟常忽略的基础 - ArrayHelper

本文导航

  1. 速读
  • 作者:KK

  • 发表日期:2016.9.7


速读

类名:yii\helpers\ArrayHelper(数组助手)

这个类是一个数组助手类,在官方示例的高级应用模板里的入口文件上就用到了,它是一个非常不错的类,项目里经常处理数据的时候当然少不了数组的处理,它可以为我们节省很多不必要的代码,提高开发效率,简化代码逻辑

这个类的全部方法都是静态的,下面是我经常用到的方法:

  • merge($a, $b)数组合并

    别看它只写两个参数,其实你传无限个参数(数组)都能进行合并,和array_merge一样支持无限参数的哦

    自带的array_merge只能做简单的数组合并,复杂数组结构合并还是要自己写一个的,而现在Yii就提供了这个加强版merge,不需要自己写了

    用途上,我们最明显的就是能看到Yii通过这个方法实现了配置覆盖,而配置覆盖带来的环境差异配置支持为项目带来了极大的好处!


  • index($array, $key)对一个数组进行索引

    $showNewsId = $_GET['newsId']; //假设是2
    $newsList = [
    	 [
    		 'id' => 1,
    		 'title' => '新闻1',
    	 ],
    	 [
    		 'id' => 2,
    		 'title' => '新闻2',
    	 ],
    	 [
    		 'id' => 1,
    		 'title' => '新闻3',
    	 ],
    ];
    $newsList = ArrayHelper::index($newsList, 'id');
    echo $newsList[$showNewsId]['title']; //输出新闻2
    

    $newsList就会变成下面这样:

    [
    	 '1' => [
    		 'id' => 1,
    		 'title' => '新闻1',
    	 ],
    	 '2' => [
    		 'id' => 2,
    		 'title' => '新闻2',
    	 ],
    	 '3' => [
    		 'id' => 1,
    		 'title' => '新闻3',
    	 ],
    ];
    

    就是每个数组元素里的id值为作索引放到外层的索引中,使得外面可以快速访问


  • getColumn($array, $name, $keepKeys = true)获取指定列的所有值,以数组形式返回

    例如刚从数据库查出的新闻数据是这样的:

    $newsList = [
    	 [
    		 'id' => 1,
    		 'category_id' => 11,
    		 'title' => '新闻1',
    	 ],
    	 [
    		 'id' => 2,
    		 'category_id' => 22,
    		 'title' => '新闻2',
    	 ],
    	 [
    		 'id' => 1,
    		 'category_id' => 33,
    		 'title' => '新闻3',
    	 ],
    ];
    

    而有时候我们需要获取所有分类ID,拼成where category_id in(11,22,33)这样去查一下相关的分类信息,先要得到三个分类ID怎么办?那当然是写个for循环用个数组将它们收集起来再说咯

    其实不用啦,这个for循环在ArrayHelper里有了:

    $categoryIds = ArrayHelper::getColumn($newsList, 'category_id');
    print_r($categoryIds); //[11,22,33]
    
    • $keepKeys参数

      这个参数平时不怎么用,我顺便演示一下

      $newsList = [
      	 'key1' => [
      		 'id' => 1,
      		 'category_id' => 11,
      		 'title' => '新闻1',
      	 ],
      	 'key2' => [
      		 'id' => 2,
      		 'category_id' => 22,
      		 'title' => '新闻2',
      	 ],
      	 'key3' => [
      		 'id' => 1,
      		 'category_id' => 33,
      		 'title' => '新闻3',
      	 ],
      ];
      $categoryIds = ArrayHelper::getColumn($newsList, 'category_id');
      print_r($categoryIds); //['key1' => 11, 'key2' => 22, 'key3' => 33]   注意,是有key的
      

      $keepKeys就是保持key的意思,和被采集的数组一样保持了第一层key,并且默认就是保持的

      如果第3个参数传false的话就不会有key了,会自动从0,1,2……这样将数组重新索引


其它实用的方法还有map(创建索引并返回,以及有类似sql group by的功能将一个数组分组)

还有multisort对二维数组进行指定列的排序,相信大家偶尔有这种需求吧,网上也搜了不少文章复制代码实现吧