PHP实用系统函数之数组篇
-
array
-
array_merge
-
说明:array array_merge ( array
$array1
[, array$...
] )将一个或多个数组的单元合并起来,一个数组中的值附加在前一个数组的后面。返回作为结 果的数组。
注:如果输入的数组中有相同的字符串键名,则该键名后面的值将覆盖前一个值。然而,如果数组包含数字键名,后面的值将不会覆盖原来的值,而是附加到后面。
如果只给了一个数组并且该数组是数字索引的,则键名会以连续方式重新索引
-
参数:
-
array1 : 要合并的第一个数组
-
. . . : 要合并的数组列表
-
-
返回值:返回结果数组
-
-
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
-
说明: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'); -
#2
username 列是从对象获取 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()
-
array_shift()
-
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()
-
prev()
-
current()
-
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
)
*/
-
-