分类 PHP 下的文章

在处理关联数组时,经常需要对多维数组按指定字段分组聚合,下面封装了一个数组分组聚合方法:

/**
 * 对数组进行分组聚合
 * @param $array
 * @param $keys
 * @return $result
 */
function array_group_by($array, $keys)
{
    if(!is_array($keys) || count($keys) == 1)
    {
        $key = is_array($keys) ? array_shift($keys) : $keys;

        return array_reduce($array, function($tmp_result, $item) use ($key)
        {
            $tmp_result[$item[$key]][] = $item;

            return $tmp_result;
        });
    }
    else
    {
        $keys = array_values($keys);

        $result = array_group_by($array, array_shift($keys));

        foreach ($result as $k=>$value)
        {
            $result[$k] = array_group_by($value, $keys);
        }

        return $result;
    }
}

测试:

$arr = [
     [
       "first" => "aa",
       "second" => "ccc",
       "third" => "sdfgg",
     ],
     [
       "first" => "aa",
       "second" => "ccc",
       "third" => "dddsa",
     ],
     [
       "first" => "aa",
       "second" => "sdfsdfd",
       "third" => "sdfgg",
     ],
     [
       "first" => "bb",
       "second" => "ccc",
       "third" => "sdfgg",
     ],
     [
       "first" => "bb",
       "second" => "sdfsdfd",
       "third" => "sdfgg",
     ],
   ];
    
    print_r(array_group_by($arr, ['first']));
    /*
    [
     "aa" => [
       [
         "first" => "aa",
         "second" => "ccc",
         "third" => "sdfgg",
       ],
       [
         "first" => "aa",
         "second" => "ccc",
         "third" => "dddsa",
       ],
       [
         "first" => "aa",
         "second" => "sdfsdfd",
         "third" => "sdfgg",
       ],
     ],
     "bb" => [
       [
         "first" => "bb",
         "second" => "ccc",
         "third" => "sdfgg",
       ],
       [
         "first" => "bb",
         "second" => "sdfsdfd",
         "third" => "sdfgg",
       ],
     ],
   ]
    */
    print_r(array_group_by($arr, ['first','second']));
    /*
    [
     "aa" => [
       "ccc" => [
         [
           "first" => "aa",
           "second" => "ccc",
           "third" => "sdfgg",
         ],
         [
           "first" => "aa",
           "second" => "ccc",
           "third" => "dddsa",
         ],
       ],
       "sdfsdfd" => [
         [
           "first" => "aa",
           "second" => "sdfsdfd",
           "third" => "sdfgg",
         ],
       ],
     ],
     "bb" => [
       "ccc" => [
         [
           "first" => "bb",
           "second" => "ccc",
           "third" => "sdfgg",
         ],
       ],
       "sdfsdfd" => [
         [
           "first" => "bb",
           "second" => "sdfsdfd",
           "third" => "sdfgg",
         ],
       ],
     ],
   ]
    */

Composer作为PHP的组件化管理工具,实现了laravel框架的组件安装、更新、移除,以及自动加载功能,下面就深入解析这是如何实现的。

使用Composer安装组件,首先需要创建composer.json文件,composer.json示例如下:
在这里插入图片描述
我的个人博客:逐步前行STEP

该文件定义了项目的基本信息以及所依赖组件的名称、版本、再执行composer install将所依赖组件安装到项目的vendor目录中。完成安装后会自动生成 composer.lock 文件,该文件罗列了各个组件确切的版本以及安装方式:
在这里插入图片描述
当执行composer install时首先检查是否存在该文件,如果存在就下载该文件中能够规定的组件以及版本。

我的个人博客:逐步前行STEP

在安装好组件之后,vendor目录下除了组件目录还会生成一个composer目录,以及自动加载文件autoload.php
在这里插入图片描述
引入这个文件,就可以实现自动加载了,可以直接在项目中使用组件。看一下该文件的具体内容:
在这里插入图片描述

仅仅2行代码,只做了一件事:引入composer/autoload_real.php文件,也就是说,实际上实现了自动加载的代码都在composer目录中,进入该目录:
在这里插入图片描述
先查看autoload_real.php,其中被audoload.php 执行的静态函数代码如下:

我的个人博客:逐步前行STEP

public static function getLoader()
    {
        if (null !== self::$loader) {
            return self::$loader;
        }

        spl_autoload_register(array('ComposerAutoloaderInit67db00000000012c704d3566', 'loadClassLoader'), true, true);
        self::$loader = $loader = new \Composer\Autoload\ClassLoader();
        spl_autoload_unregister(array('ComposerAutoloaderInit67db00000000012c704d3566', 'loadClassLoader'));

    ......
    }

在这个方法中,spl_autoload_register 函数用于注册给定的函数作为 __autoload 的实现,上述代码注册的__autoload实现是loadClassLoader方法:

    public static function loadClassLoader($class)
    {
        if ('Composer\Autoload\ClassLoader' === $class) {
            require __DIR__ . '/ClassLoader.php';
        }
    }

该方法引入了ClassLoader.php,随后 getLoader() 方法实例化ClassLoader 并且使用spl_autoload_unregister注销了该__autoload实现,之后的二十多行代码实现了自动加载,在解析这部分代码之前,需要先了解php规范

PSR 是 PHP Standard Recommendations (PHP 推荐标准)的简写,由 PHP FIG 组织制定的 PHP 规范,是 PHP 开发的实践标准。其中:

   PSR-0:自动加载标准,2014-10-21该标准已经被废弃,使用PSR-4替    代,不再细讲
   PSR-4:自动加载

PSR-0 和 PSR-4 的自动加载规范,虽然PSR-0已经弃用,但是Composer仍然兼容PSR-0,具体规范如下:
1、PSR-0

一个标准的 命名空间 (namespace) 与 类 (class) 名称的定义必须符合以下结构: <Vendor Name>(<Namespace>)*<Class Name>;

其中 Vendor Name 为每个命名空间都必须要有的一个顶级命名空间名;
需要的话,每个命名空间下可