PHP实用系统函数之数组篇

PHP中十分实用的系统函数

  • array

    • array_merge

      1. 说明:array  array_merge ( array $array1 [, array $... ] )

        将一个或多个数组的单元合并起来,一个数组中的值附加在前一个数组的后面。返回作为结 果的数组。

        注:如果输入的数组中有相同的字符串键名,则该键名后面的值将覆盖前一个值。然而,如果数组包含数字键名,后面的值将不会覆盖原来的值,而是附加到后面。

        如果只给了一个数组并且该数组是数字索引的,则键名会以连续方式重新索引

      2. 参数:

        • array1 : 要合并的第一个数组

        • . . . : 要合并的数组列表

      3. 返回值:返回结果数组

    • Example

      <?php
      $array1 = array("color" => "red", 2, 4);
      $array2 = array("a", "b", "color" => "green", "shape" => "trapezoid", 4);
      $result = array_merge($array1, $array2);
      print_r($result);
      ?>
      /*
      Array (
      [color] => green
      [0] => 2
      [1] => 4
      [2] => a
      [3] => b
      [shape] => trapezoid
      [4] => 4
      )
      */
  • 相关算法应用

    <?php
    /**
    * [quickSort 快速排序法]
    * @param [array] $arr [需要排序数组]
    * @return [array]     [返回参数或处理后的满足条件数组]
    */
    function quickSort($arr){
    if(!is_array($arr) || count($arr) <=1){
    return $arr;
    }
    $key = $arr[0];
    $left_arr = array();
    $right_arr = array();
    for($i = 1;$i < count($arr);$i++){
    if($key > $arr[$i]){
    $left_arr[] = $arr[$i];
    }else{
    $right_arr[] = $arr[$i];
    }
    }
    $left_arr = quickSort($left_arr);
    $right_arr = quickSort($right_arr);
    return array_merge($left_arr,array($key),$right_arr);
    }
  • array_unique

    1. 说明:array array_unique ( array $array [, int $sort_flags = SORT_STRING ] )

      注意键名保留不变。array_unique() 先将值作为字符串排序,然后对每个值只保留第一个遇到的键名,接着忽略所有后面的键名。这并不意味着在未排序的 array 中同一个值的第一个出现的键名会被保留。

      注:Note: 当且仅当 (string) elem2 时两个单元被认为相同。 例如,字符串表达一样时,会使用首个元素。

    2. 参数:

      • array : 输入的数组

      • sort_flags :第二个可选参数sort_flags 可用于修改排序行为

        • 排序类型标记:

          • SORT_REGULAR - 按照通常方法比较(不修改类型)

          • SORT_NUMERIC - 按照数字形式比较

          • SORT_STRING - 按照字符串形式比较

          • SORT_LOCALE_STRING - 根据当前的本地化设置,按照字符串比较。

    3. 返回值:返回过滤后的数组

    4. 注释:Note: 注意, array_unique() 不能应用于多维数组。

    5. 对于二维数组去重值的两种方法


      <?php
      /**
      * [array_unique_fn 二维数组去重值(保留数组键名)]
      * @param [array] $arr [description]
      * @return [array] $tmp1   [description]
      */
      function array_unique_fn($arr){
      foreach($arr as $val){
      $val = join(',',$val);
      $tmp[] = $val;
      }
      $tmp = array_unique($tmp);
      foreach ($tmp as $k => $v){
      $array = explode(',',$v);
          // 根据需要自定义过滤数组键名
      $tmp1[$k]['id'] = $array[0];
      $tmp1[$k]['title'] = $array[1];
      $tmp1[$k]['imgurl'] = $array[2];
      }
      return $tmp1;
      }
      /**
      * [array_unique_fn 二维数组去重值]
      * @param [array] $arr [description]
      * @return [array] $temp   [description]
      */
      function array_unique_fb($arr)
      {
       foreach ($arr as $v)
      {
         $v = join(",",$v);  
         $temp[] = $v;
      }
       $temp = array_unique($temp);  
       foreach ($temp as $k => $v)
      {
         $temp[$k] = explode(",",$v);  
      }
       return $temp;
      }
  • array_multisort

    1. 说明:bool array_multisort ( array &$array1 [, mixed $array1_sort_order = SORT_ASC [, mixed $array1_sort_flags = SORT_REGULAR[, mixed $... ]]] )

      array_multisort() 可以用来一次对多个数组进行排序,或者根据某一维或多维对多维数组进行排序。

      关联(string)键名保持不变,但数字键名会被重新索引。

    2. 参数:

      • array1 : 要排序的array

      • array1_sort_order : SORT_ASC 按照上升顺序排序, SORT_DESC 按照下降顺序排序。

        此参数可以和 array1_sort_flags 互换,也可以完全删除,默认是 SORT_ASC 。

      • array1_sort_flags : 为array 参数设定参数选项:

        • SORT_REGULAR - 将项目按照通常方法比较(不修改类型)

        • SORT_NUMERIC - 按照数字大小比较

        • SORT_STRING - 按照字符串比较

        • SORT_LOCALE_STRING - 根据当前的本地化设置,按照字符串比较。 它会使用 locale 信息,可以通过 setlocale() 修改此信息。

        • SORT_NATURAL - 以字符串的"自然排序",类似 natsort()

        • SORT_FLAG_CASE - 可以组合 (按位或 OR) SORT_STRING 或者 SORT_NATURAL 大小写不敏感的方式排序字符串。

        • 参数可以和 array1_sort_order 交换或者省略,默认情况下是 SORT_REGULAR

      • . . . : 可选的选项,可提供更多数组,跟随在 sort order 和 sort flag 之后。 提供的数组和之前的数组要有相同数量的元素。 换言之,排序是按字典顺序排列的。

    3. 返回值:成功返回TRUE,失败返回FALSE

    4. Example:

      • 多维数组按照某一列键值排序

        <?php 
        $arr = array(
        array(
        'id'=>577,
        'name'=>'lee',
        'updateTime'=>'2018-1-1'
        ),
        array(
        'id'=>200,
        'name'=>'Any',
        'updateTime'=>'2019-1-1'
        ),
        array(
        'id'=>566,
        'name'=>'Tony',
        'updateTime'=>'2017-1-1'
        )
        );

        /*
        取出键名为`updateTime`的所有键值并返回新的索引数组。
        Array (
        [0] => 2018-1-1
        [1] => 2019-1-1
        [2] => 2017-1-1
        )
        */
        $tmp = array_column($arr,'updateTime');

        /*
        按照正序方式,基于排序数组排序,返回值为True或False
        Array (
        [0] => Array ( [id] => 566 [name] => Tony [updateTime] => 2017-1-1 )
        [1] => Array ( [id] => 577 [name] => lee [updateTime] => 2018-1-1 )
        [2] => Array ( [id] => 200 [name] => Any [updateTime] => 2019-1-1 )
        )
        */
        array_multisort($tmp,SORT_ASC,$arr);
  • array_column

    1. 说明:array array_column ( array $input , mixed $column_key [, mixed $index_key = null ] )

      返回input数组中键值为column_key的列, 如果指定了可选参数index_key,那么input数组中的这一列的值将作为返回数组中对应值的键。

    2. 参数:

      • input:需要取出数组列的多维数组。 如果提供的是包含一组对象的数组,只有 public 属性会被直接取出。 为了也能取出 private 和 protected 属性,类必须实现 __get()__isset() 魔术方法。(见Example #3)

      • column_key:需要返回值的列,它可以是索引数组的列索引,或者是关联数组的列的键,也可以是属性名。 也可以是NULL,此时将返回整个数组(配合index_key参数来重置数组键的时候,非常管用)

      • index_key:作为返回数组的索引/键的列,它可以是该列的整数索引,或者字符串键值。

    3. 返回值:从多维数组中返回单列数组。

    4. Example:

      • #1获取多维数组某一列值


        <?php
        $arr = array(
        array(
        'id'=>577,
        'name'=>'lee',
        'updateTime'=>'2018-1-1'
        ),
        array(
        'id'=>200,
        'name'=>'Any',
        'updateTime'=>'2019-1-1'
        ),
        array(
        'id'=>566,
        'name'=>'Tony',
        'updateTime'=>'2017-1-1'
        )
        );

        /*
        取出键名为`updateTime`的所有键值并返回新的索引数组。
        Array (
        [0] => 2018-1-1
        [1] => 2019-1-1
        [2] => 2017-1-1
        )
        */
        $tmp = array_column($arr,'updateTime');
        /*
        取出键名为`updateTime`的所有键值并返回新的索引数组并用键名`id`的键值为新数组的键名。
        Array (
        [577] => 2018-1-1
        [200] => 2019-1-1
        [566] => 2017-1-1
        )
        */
        $tmp_new = array_column($arr,'updateTime','id');
      • #2username 列是从对象获取 public 的 "username" 属性


        <?php

        class User
        {
           public $username;

           public function __construct(string $username)
          {
               $this->username = $username;
          }
        }

        $users = [
           new User('user 1'),
           new User('user 2'),
           new User('user 3'),
        ];

        print_r(array_column($users, 'username'));
        /*
        输出结果
        Array
        (
           [0] => user 1
           [1] => user 2
           [2] => user 3
        )
        */

      • #3获取 username 列,从对象通过魔术方法 __get() 获取 private 的 "username" 属性。


        <?php

        class Person
        {
           private $name;

           public function __construct(string $name)
          {
               $this->name = $name;
          }

           public function __get($prop)
          {
               return $this->$prop;
          }

           public function __isset($prop) : bool
          {
               return isset($this->$prop);
          }
        }

        $people = [
           new Person('Fred'),
           new Person('Jane'),
           new Person('John'),
        ];

        print_r(array_column($people, 'name'));
        /*
        输出结果
        Array
        (
           [0] => Fred
           [1] => Jane
           [2] => John
        )
        * 如果不提供__isset()魔术方法,将返回空数组
        */
  • count()

    • 说明:int count ( mixed $array_or_countable [, int $mode = COUNT_NORMAL ] )

      计算数组中的单元数目,或者对象中的个数

    • 参数:

      • array_or_countable:数组或者Countable对象

      • mode:如果可选的 mode 参数设为 COUNT_RECURSIVE(或 1),count() 将递归地对数组计数。对计算多维数组的所有单元尤其有用。

      • 返回值:返回 array_or_countable 中的单元数目。 如果参数既不是数组,也不是实现 Countable 接口的对象,将返回 1。 有个例外:如果array_or_countableNULL 则结果是 0

      • Example


        <?php
        $food = array(
           'fruits' => array('orange', 'banana', 'apple'),
           'veggie' => array('carrot', 'collard', 'pea')
        );

        // recursive count
        echo count($food, COUNT_RECURSIVE); // output 8

        // normal count
        echo count($food); // output 2

  • array_push()

    • 说明:int array_push ( array &$array , mixed $value1 [, mixed $... ] )

      array_push()array 当成一个栈,并将传入的变量压入 array 的末尾。array 的长度将根据入栈变量的数目增加。

    • 参数:

      • array:输入的数组

      • value1:要压入array数组末尾的第一个值

    • 返回值:返回处理后的数组元素个数

    • 注*:如果只是使用array_push()来给数组增加一个单元,使用$array[] = ,可以省去调用函数的额外负担

    • Example


      <?php
      $stack = array("orange", "banana");
      array_push($stack, "apple", "raspberry");
      print_r($stack);
      /*
      Array
      (
         [0] => orange
         [1] => banana
         [2] => apple
         [3] => raspberry
      )
      */
      ?>
  • array_pop()

    • 说明:mixed array_pop ( array &$array )

      array_pop() 弹出并返回 array 数组的最后一个单元,并将数组 array 的长度减一。

      Note: 使用此函数后会重置(reset()array 指针。

    • 参数:

      • array:需要做出栈的数组

    • 返回值:返回 array 的最后一个值。如果 array 是空(如果不是一个数组),将会返回 NULL

  • array_shift()

    • 说明:mixed array_shift ( array &$array )

      array_shift()array 的第一个单元移出并作为结果返回,将 array 的长度减一并将所有其它单元向前移动一位。所有的数字键名将改为从零开始计数,文字键名将不变。

      Note: 使用此函数后会重置(reset()array 指针。

    • 参数:

      • array:输入的数组

    • 返回值:返回移除的值,如果 array 为空或者不是一个数组则返回 NULL

  • array_unshift()

    • 说明:int array_unshift ( array &$array , mixed $value1 [, mixed $... ] )

      array_unshift() 将传入的单元插入到 array 数组的开头。注意单元是作为整体被插入的,因此传入单元将保持同样的顺序。所有的数值键名将修改为从零开始重新计数,所有的文字键名保持不变。

    • 参数:

      • array:输入的数组

      • value1:开头插入的变量

    • 返回值:返回array数组新的单元数目

    • Example:


      <?php
      $queue = array("orange", "banana");
      array_unshift($queue, "apple", "raspberry");
      print_r($queue);
      ?>
      /*
      Array
      (
         [0] => apple
         [1] => raspberry
         [2] => orange
         [3] => banana
      )
      */

  • in_array()

    • 说明:bool in_array ( mixed $needle , array $haystack [, bool $strict = FALSE ] )

      检查数组中是否存在某个值,如大海捞针,在大海(haystack)中搜索针( needle),如果没有设置 strict 则使用宽松的比较。

    • 参数:

      • needle:待搜索的值。Note:如果needle是字符串,则比较是区分大小写的。

      • haystack:带搜索的数组。

      • strict:如果第三个参数 strict 的值为 TRUEin_array() 函数还会检查 needle类型是否和 haystack 中的相同。

    • 返回值:如果找到 needle 则返回 TRUE ,否则返回 FALSE

    • Example:

      • 判断值的数据类型为字符时


        <?php
        $os = array("Mac", "NT", "Irix", "Linux");
        if (in_array("Irix", $os)) {
           echo "Got Irix";
        }
        if (in_array("mac", $os)) {
           echo "Got mac";
        }
        ?>
        /*
        Got Irix
        */
      • 严格类型判断


        <?php
        $a = array('1.10', 12.4, 1.13);

        if (in_array('12.4', $a, true)) {
           echo "'12.4' found with strict check\n";
        }

        if (in_array(1.13, $a, true)) {
           echo "1.13 found with strict check\n";
        }
        ?>
        /*
        1.13 found with strict check
        */
  • 数组相关的指针函数(可编写PHP消息队列)

    • reset()

      • 说明:mixed reset ( array &$array )

        将数组的内部指针指向第一个单元

      • 参数:

        • array:输入的数组

      • 返回值:返回数组第一个单元的值,如果数组为空则返回 FALSE

    • end()

      • 说明:mixed end ( array &$array )

        将数组的内部指针指向最后一个单元

      • 参数:

        • array:这个数组。 该数组是通过引用传递的,因为它会被这个函数修改。 这意味着你必须传入一个真正的变量,而不是函数返回的数组,因为只有真正的变量才能以引用传递

      • 返回值:返回最后一个元素的值,或者如果是空数组则返回 FALSE

    • next()

      • 说明:mixed next ( array &$array )

        next()current() 的行为类似,只有一点区别,在返回值之前将内部指针向前移动一位。这意味着它返回的是下一个数组单元的值并将数组指针向前移动了一位。

      • 参数:

        • array:受影响的 array

      • 返回值:返回数组内部指针指向的下一个单元的值,或当没有更多单元时返回 FALSE

      • Warning:此函数可能返回布尔值 FALSE,但也可能返回等同于 FALSE 的非布尔值。应使用 === 运算符来测试此函数的返回值。

    • prev()

      • 说明:mixed prev ( array &$array )

        将数组的内部指针倒回一位

      • 参数:

        • array:输入的数组

      • 返回值:返回数组内部指针指向的前一个单元的值,或当没有更多单元时返回 FALSE

      • Warning:此函数可能返回布尔值 FALSE,但也可能返回等同于 FALSE 的非布尔值。应使用 === 运算符来测试此函数的返回值。

    • current()

      • 说明:mixed current ( array &$array )

        返回数组中的当前单元

      • 参数:

        • array:此数组

      • 返回值:current() 函数返回当前被内部指针指向的数组单元的值,并不移动指针。如果内部指针指向超出了单元列表的末端,current() 返回 FALSE

      • Warning:此函数可能返回布尔值 FALSE,但也可能返回等同于 FALSE 的非布尔值。应使用 === 运算符来测试此函数的返回值。

    • Example:


      <?php

      $array = array('step one', 'step two', 'step three', 'step four');

      // by default, the pointer is on the first element
      echo current($array) . "<br />\n"; // "step one"

      // skip two steps
      next($array);
      echo current($array) . "<br/>\n"; // "step two"
      prev($array);
      echo current($array) . "<br />\n"; // "step one"

      // reset pointer, start again on step one
      reset($array);
      echo current($array) . "<br />\n"; // "step one"

      ?>
    • each()

      • 说明:array each ( array &$array )

        返回数组中当前的键/值对并将数组指针向前移动一步

        —— 在执行 each() 之后,数组指针将停留在数组中的下一个单元或者当碰到数组结尾时停留在最后一个单元。如果要再用 each 遍历数组,必须使用 reset()

      • 参数:

        • array:输入的数组

      • 返回值:返回 array 数组中当前指针位置的键/值对并向前移动数组指针。键值对被返回为四个单元的数组,键名为01keyvalue。单元 0key 包含有数组单元的键名,1value 包含有数据。

        如果内部指针越过了数组的末端,则 each() 返回 FALSE

      • Example:


        <?php
        $foo = array("bob", "fred", "jussi", "jouni", "egon", "marliese");
        $bar = each($foo);
        print_r($bar);
        ?>
        /*
        $bar 现在包含有如下的键/值对:
        Array
        (
           [1] => bob
           [value] => bob
           [0] => 0
           [key] => 0
        )
        */

posted @ 2018-03-21 09:25  MR_leew  阅读(251)  评论(0编辑  收藏  举报