相关算法应用
- <?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
说明: array
- array_unique
- ( array $array [, int $sort_flags = SORT_STRING ] )
注意键名保留不变 array_unique() 先将值作为字符串排序, 然后对每个值只保留第一个遇到的键名, 接着忽略所有后面的键名这并不意味着在未排序的 array 中同一个值的第一个出现的键名会被保留
注:
Note
: 当且仅当
(string)
?elem2
时两个单元被认为相同 例如, 字符串表达一样时, 会使用首个元素
参数:
array : 输入的数组
sort_flags : 第二个可选参数 sort_flags 可用于修改排序行为
排序类型标记:
SORT_REGULAR - 按照通常方法比较(不修改类型)
SORT_NUMERIC - 按照数字形式比较
SORT_STRING - 按照字符串形式比较
SORT_LOCALE_STRING - 根据当前的本地化设置, 按照字符串比较
返回值: 返回过滤后的数组
注释:
Note: 注意, array_unique() 不能应用于多维数组
对于二维数组去重值的两种方法
- <?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
说明: bool array_multisort ( array &$array1 [, mixed $array1_sort_order = SORT_ASC [, mixed $array1_sort_flags
- = SORT_REGULAR[,
- mixed $... ]]] )
array_multisort() 可以用来一次对多个数组进行排序, 或者根据某一维或多维对多维数组进行排序
关联 (string) 键名保持不变, 但数字键名会被重新索引
参数:
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 之后 提供的数组和之前的数组要有相同数量的元素 换言之, 排序是按字典顺序排列的
返回值: 成功返回 TRUE, 失败返回 FALSE
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
说明: array
- array_column
- ( array
- $input
- ,
- mixed
- $column_key
- [,
- mixed $index_key = null ] )
返回 input 数组中键值为 column_key 的列, 如果指定了可选参数 index_key, 那么 input 数组中的这一列的值将作为返回数组中对应值的键
参数:
input: 需要取出数组列的多维数组 如果提供的是包含一组对象的数组, 只有 public 属性会被直接取出 为了也能取出 private 和 protected 属性, 类必须实现
__get() 和 __isset() 魔术方法(见 Example #3)
column_key: 需要返回值的列, 它可以是索引数组的列索引, 或者是关联数组的列的键, 也可以是属性名 也可以是
NULL, 此时将返回整个数组(配合 index_key 参数来重置数组键的时候, 非常管用)
index_key: 作为返回数组的索引 / 键的列, 它可以是该列的整数索引, 或者字符串键值
返回值: 从多维数组中返回单列数组
- 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_countable
是
NULL 则结果是 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 的值为 TRUE 则 in_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 数组中当前指针位置的键 / 值对并向前移动数组指针键值对被返回为四个单元的数组, 键名为
0
,
1
,
key
和
value
单元
0
和
key
包含有数组单元的键名,
1 和 value 包含有数据
如果内部指针越过了数组的末端, 则
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
- )
- */
- ?
来源: http://www.bubuko.com/infodetail-2533646.html