数组的排序函数
冒泡排序
<?php
$arr = array(0,1,22,3,44,5,6,7,88,9);
//从大到小
function mysort(&$arr) {
$len = count($arr);
for($i=0; $i<$len-1; $i++) {
for($j = 0; $j < $len-$i-1; $j++) {
if($arr[$j] > $arr[$j+1]) {
$tmp = $arr[$j];
$arr[$j] = $arr[$j+1];
$arr[$j+1] = $tmp;
}
}
}
}
mysort($arr);
print_r($arr);
快速排序
<?php
$arr=array(20,18,33,17,44,15,22,13,25,34,11,18,66);
function qsort($arr){
if(!is_array($arr)||empty($arr))
return array();//返回空数组;
$len=count($arr);
if($len<=1) return $arr;
$key=$arr[0];
$left=array();
$right=array();
for($i=1;$i<$len;$i++){
if($arr[$i]<=$key)$left[]=$arr[$i];
else $right[]=$arr[$i];
}
print_r($left);
echo '<br>';
print_r($right);
echo '<br>';
qsort($left);
qsort($right);
}
print_r($arr);
echo '<br>';
print_r(qsort($arr));
输出:
Array ( [0] => 18 [1] => 17 [2] => 15 [3] => 13 [4] => 11 [5] => 18 )
Array ( [0] => 33 [1] => 44 [2] => 22 [3] => 25 [4] => 34 [5] => 66 )
Array ( [0] => 17 [1] => 15 [2] => 13 [3] => 11 [4] => 18 )
Array ( )
Array ( [0] => 15 [1] => 13 [2] => 11 )
Array ( [0] => 18 )
Array ( [0] => 13 [1] => 11 )
Array ( )
Array ( [0] => 11 )
Array ( )
Array ( [0] => 22 [1] => 25 )
Array ( [0] => 44 [1] => 34 [2] => 66 )
Array ( )
Array ( [0] => 25 )
Array ( [0] => 34 )
Array ( [0] => 66 )
<?php
$arr=array(20,18,33,17,44,15,22,13,25,34,11,18,66);
function qsort($arr){
if(!is_array($arr)||empty($arr))
return array();//返回空数组;
$len=count($arr);
if($len<=1) return $arr;
$key[0]=$arr[0];///
$left=array();
$right=array();
for($i=1;$i<$len;$i++){
if($arr[$i]<=$key[0])$left[]=$arr[$i];
else $right[]=$arr[$i];
}
print_r($left);
echo '<br>';
print_r($right);
echo '<br>';
$left=qsort($left);
$right=qsort($right);
return array_merge($left,$key,$right);
}
print_r($arr);
echo '<br>';
print_r(qsort($arr));
注意那个key应该用数组,因为merge是合并数组 Array ( [0] => 18 [1] => 17 [2] => 15 [3] => 13 [4] => 11 [5] => 18 )
Array ( [0] => 33 [1] => 44 [2] => 22 [3] => 25 [4] => 34 [5] => 66 )
Array ( [0] => 17 [1] => 15 [2] => 13 [3] => 11 [4] => 18 )
Array ( )
Array ( [0] => 15 [1] => 13 [2] => 11 )
Array ( [0] => 18 )
Array ( [0] => 13 [1] => 11 )
Array ( )
Array ( [0] => 11 )
Array ( )
Array ( [0] => 22 [1] => 25 )
Array ( [0] => 44 [1] => 34 [2] => 66 )
Array ( )
Array ( [0] => 25 )
Array ( [0] => 34 )
Array ( [0] => 66 )
Array ( [0] => 11 [1] => 13 [2] => 15 [3] => 17 [4] => 18 [5] => 18 [6] => 20 [7] => 22 [8] => 25 [9] => 33 [10] => 34 [11] => 44 [12] => 66 )
弱弱的吐槽一下,这玩意哪里不好理解了==(森森的成就感。反正php里面都有这些内置函数,据说掌握这玩意能提高思维,呵呵呵
sort -- 对数组排序(升序)
rsort -- 对数组逆向排序(降序)
<?php
// $arr = array(1, 2, 3, 5,4,8,7,9,6,0);
$arr = array("one", "two", 100=>"three", "four", "five");
print_r($arr);
echo '<br>';
rsort($arr);
print_r($arr);
echo '<br>';
ksort -- 对数组按照键名排序
<?php
$arr=array(3=>"fighting",1=>"MissZhou",2=>"willing");
ksort($arr);
print_r($arr);
输出:
Array ( [1] => MissZhou [2] => willing [3] => fighting )废话么
<?php
$lamp=array("l"=>"linux","a"=>"apache","m"=>"mysql","p"=>"php");
print_r($lamp);
echo '<br>';
sort($lamp);
print_r($lamp);
$lamp=array("l"=>"linux","a"=>"apache","m"=>"mysql","p"=>"php");
echo '<br>';
asort($lamp);
print_r($lamp);
echo '<br>';
Array ( [l] => linux [a] => apache [m] => mysql [p] => php )
Array ( [0] => apache [1] => linux [2] => mysql [3] => php )
Array ( [a] => apache [l] => linux [m] => mysql [p] => php )
arsort -- 对数组进行逆向排序并保持索引关系
natsort -- 用“自然排序”算法对数组排序
<?php
$a=array("file1.txt","file11.txt","file2.txt");
print_r($a);
echo '<br>';
natsort($a);
print_r($a);
Array ( [0] => file1.txt [1] => file11.txt [2] => file2.txt )
Array ( [0] => file1.txt [2] => file2.txt [1] => file11.txt )
<?php
$a=array("File1.txt","File11.txt","file2.txt");
print_r($a);
echo '<br>';
natsort($a);
print_r($a);
echo '<br>';
natcasesort($a);
print_r($a);
echo '<br>';
输出:
Array ( [0] => File1.txt [1] => File11.txt [2] => file2.txt )
Array ( [0] => File1.txt [1] => File11.txt [2] => file2.txt )
Array ( [0] => File1.txt [2] => file2.txt [1] => File11.txt )
usort -- 使用用户自定义的比较函数对数组中的值进行排序
说什么来什么,当初我学回调函数的时候就想到了排序时候的已定义函数(得意。
<?php
$arr=array("1111","111111","111","1");
print_r($arr);
echo '<br>';
usort($arr,function($a,$b){
$alen=strlen($a);
$blen=strlen($b);
if($alen>$blen)return 1;
else if($alen<$blen) return -1;
else return 0;
});
print_r($arr);
Array ( [0] => 1111 [1] => 111111 [2] => 111 [3] => 1 )
Array ( [0] => 1 [1] => 111 [2] => 1111 [3] => 111111 )
<?php
$arr=array("1111","111111","111","1");
print_r($arr);
echo '<br>';
uasort($arr,function($a,$b){
$alen=strlen($a);
$blen=strlen($b);
if($alen>$blen)return 1;
else if($alen<$blen) return -1;
else return 0;
});
print_r($arr);
Array ( [0] => 1111 [1] => 111111 [2] => 111 [3] => 1 )
Array ( [3] => 1 [2] => 111 [0] => 1111 [1] => 111111 )
array_multisort -- 对多个数组或多维数组进行排序
复杂的数组函数~~好神奇,看了半天才明白==灰常灰常强大~~~
<?php
$a=array("a",10,"b",20);
$b=array(1,4,3,2);
array_multisort($a,SORT_DESC,$b,SORT_ASC);
print_r($a);
echo '<br>';
print_r($b);
猜猜输出什么:
Array ( [0] => 20 [1] => 10 [2] => b [3] => a )
Array ( [0] => 2 [1] => 4 [2] => 3 [3] => 1 )
再看一个微微复杂的栗子~传入多个数组
<?php
$data = array(
array("id"=>1, "name"=>"aa", "age"=>10),
array("id"=>2, "name"=>"ww", "age"=>30),
array("id"=>3, "name"=>"cc", "age"=>30),
array("id"=>4, "name"=>"dd", "age"=>"40")
);
$ages=array();
$names=array();
foreach($data as $value){
$ages[]=$value['age'];
$names[]=$value['name'];
}
array_multisort($ages,SORT_DESC,$names,$data);
echo '<pre>';
print_r($data);
echo '</pre>';
就是按ages降序,names升序来排列date这个数组。嗯,机智如我早就想到了PHP中的数组可以达到c中结构体的作用,伟大的array_multisort()又替代了cmp的排序比较。PHP是最好的语言~~~
所以输出:
Array ( [0] => Array ( [id] => 4 [name] => dd [age] => 40 ) [1] => Array ( [id] => 3 [name] => cc [age] => 30 ) [2] => Array ( [id] => 2 [name] => ww [age] => 30 ) [3] => Array ( [id] => 1 [name] => aa [age] => 10 ) )
拆分、合并、分解与结合数组
array_slice -- 从数组中取出一段
语法: array array_slice ( array array, int offset [, int length [, bool preserve_keys]] )array_slice() 返回根据 offset 和 length 参数所指定的 array 数组中的一段序列。
如果 offset 非负,则序列将从 array 中的此偏移量开始。如果 offset 为负,则序列将从 array 中距离末端这么远的地方开始。
如果给出了 length 并且为正,则序列中将具有这么多的单元。如果给出了 length 并且为负,则序列将终止在距离数组末端这么远的地方。如果省略,则序列将从 offset 开始一直到 array 的末端。
<?php
$arr=array('a','b','c','d','e');
$narr=array_slice($arr,-3,2,true);
print_r($narr);
true保留下标 Array ( [2] => c [3] => d )
array_splice -- 把数组中的一部分去掉并用其它值取代
语法:array array_splice ( array &input, int offset [, int length [, array replacement]] ) 注意是引用类型的啊啊啊啊啊啊啊~。~array_splice() 把 input 数组中由 offset 和 length 指定的单元去掉,如果提供了 replacement 参数,则用 replacement 数组中的单元取代。返回一个包含有被移除单元的数组。注意 input 中的数字键名不被保留。
如果 offset 为正,则从 input 数组中该值指定的偏移量开始移除。如果 offset 为负,则从 input 末尾倒数该值指定的偏移量开始移除。
如果省略 length,则移除数组中从 offset 到结尾的所有部分。
如果给出了 replacement 数组,则被移除的单元被此数组中的单元替代。
<?php
$arr=array('a','b','c','d','e');
//$narr=array_slice($arr,-3,2,true);
array_splice($arr,2,2);
print_r($arr);
Array ( [0] => a [1] => b [2] => e ) 保留没删的
<?php
$arr=array('a','b','c','d','e');
//$narr=array_slice($arr,-3,2,true);
array_splice($arr,-3,2,"hello");
print_r($arr);
Array ( [0] => a [1] => b [2] => hello [3] => e )
<?php
$arr=array('a','b','c','d','e');
//$narr=array_slice($arr,-3,2,true);
array_splice($arr,-3,2,array("hello","world"));
print_r($arr);
Array ( [0] => a [1] => b [2] => hello [3] => world [4] => e )
array_combine -- 创建一个数组,用一个数组的值作为其键名,另一个数组的值作为其值
语法:array array_combine ( array keys, array values )返回一个 array,用来自 keys 数组的值作为键名,来自 values 数组的值作为相应的值。
如果两个数组的单元数不同或者数组为空时返回 FALSE。
<?php
$arr=array(1,2,3,4);
$brr=array("MissZhou","必须","好好","努力");
echo '<pre>';
print_r(array_combine($arr,$brr));
echo '</pre>';
Array ( [1] => MissZhou [2] => 必须 [3] => 好好 [4] => 努力 )上下个数必须对应!
array_merge -- 合并一个或多个数组
语法: array array_merge ( array array1 [, array array2 [, array ...]] )array_merge() 将一个或多个数组的单元合并起来,一个数组中的值附加在前一个数组的后面。返回作为结果的数组。
如果输入的数组中有相同的字符串键名,则该键名后面的值将覆盖前一个值。然而,如果数组包含数字键名,后面的值将不会覆盖原来的值,而是附加到后面。
如果只给了一个数组并且该数组是数字索引的,则键名会以连续方式重新索引。
是不是想到+运算符啦~之前不是常用嘛 然而在PHP整数可以这么用,数组不可以哟,+的特点是下标相同会覆盖,而且前面覆盖后面的╮(╯_╰)╭但是你可以事前调下标再相加啊
<?php
$arr=array("one"=>"a","b","c");
$brr=array("one"=>1,"two"=>2,"three"=>3);
$c=array_merge($arr,$brr);
var_dump($c);
array (size=5) 'one' => 1 0 => 'b' (length=1) 1 => 'c' (length=1) 'two' => 2 'three' => 3猜猜只有一个数组的呢??
<?php
$arr=array("a",5=>"b","c");
$brr=array("one"=>1,"two"=>2,"three"=>3);
$c=array_merge($arr);
var_dump($c);
array (size=3) 0 => 'a' (length=1) 1 => 'b' (length=1) 2 => 'c' (length=1)
array_intersect -- 计算数组的交集
语法 array array_intersect ( array array1, array array2 [, array ...] )array_intersect() 返回一个数组,该数组包含了所有在 array1 中也同时出现在所有其它参数数组中的值。注意键名保留不变。
<?php
$a=array(1,2,3,4);
$b=array(3,4,5,6);
print_r(array_intersect($a,$b));
Array ( [2] => 3 [3] => 4 )
array_diff -- 计算数组的差集
语法:array array_diff ( array array1, array array2 [, array ...] )array_diff() 返回一个数组,该数组包括了所有在 array1 中但是不在任何其它参数数组中的值。注意键名保留不变。
<?php
$a=array(1,2,3,4);
$b=array(3,4,5,6);
//print_r(array_intersect($a,$b));
print_r(array_diff($a,$b));
print_r(array_diff($b,$a));
Array ( [0] => 1 [1] => 2 ) Array ( [2] => 5 [3] => 6 )
数组与数据结构
array_pop -- 将数组最后一个单元弹出(出栈)
语法:mixed array_pop ( array &array )array_pop() 弹出并返回 array 数组的最后一个单元,并将数组 array 的长度减一。如果 array 为空(或者不是数组)将返回 NULL。
array_push -- 将一个或多个单元压入数组的末尾(入栈)
语法:int array_push ( array &array, mixed var [, mixed ...] )array_push() 将 array 当成一个栈,并将传入的变量压入 array 的末尾。array 的长度将根据入栈变量的数目增加。
<?php
$zhan = array();
array_push($zhan, "1");
array_push($zhan, "2");
array_push($zhan, "3", 4, 5,6);
echo array_pop($zhan)."<br>";
echo array_pop($zhan)."<br>";
echo array_pop($zhan)."<br>";
print_r($zhan);
6
5
4
Array ( [0] => 1 [1] => 2 [2] => 3 )
array_shift -- 将数组开头的单元移出数组
语法:mixed array_shift ( array &array )array_shift() 将 array 的第一个单元移出并作为结果返回,将 array 的长度减一并将所有其它单元向前移动一位。所有的数字键名将改为从零开始计数,文字键名将不变。如果 array 为空(或者不是数组),则返回 NULL。
array_unshift -- 在数组开头插入一个或多个单元
语法: int array_unshift ( array &array, mixed var [, mixed ...] )array_unshift() 将传入的单元插入到 array 数组的开头。注意单元是作为整体被插入的,因此传入单元将保持同样的顺序。所有的数值键名将修改为从零开始重新计数,所有的文字键名保持不变。
<?php
$queue=array();
array_unshift($queue,1);
array_unshift($queue,1);
array_unshift($queue,2);
array_unshift($queue,3,4,5);
echo array_pop($queue).'<br>';
print_r($queue);
1
Array ( [0] => 3 [1] => 4 [2] => 5 [3] => 2 [4] => 1 )
<?php
$queue=array();
array_unshift($queue,1);
array_unshift($queue,1);
array_unshift($queue,2);
array_unshift($queue,3,4,5);
echo array_shift($queue).'<br>';
print_r($queue);
3
Array ( [0] => 4 [1] => 5 [2] => 2 [3] => 1 [4] => 1 )
其他有用的数组处理函数
array_rand -- 从数组中随机取出一个或多个单元
<?php
$arr=array(1,2,3,4,5);
var_dump(array_rand($arr));
也是根据种子(时间)
<?php
$arr=array(1,2,3,4,5);
var_dump(array_rand($arr,2));
array (size=2) 0 => 2 1 => 3面试题:
<?php
$srcArray=array(‘a’,’b’,’c’,’d’);
$randValue=array_rand($srcArray);
$result=is_string($randValue);
?>
A、a
B、false
C、true b
D、b
E、c
false
shuffle -- 将数组打乱
<?php
$arr=array(1,2,3,4,5);
shuffle($arr);
print_r($arr);
Array ( [0] => 4 [1] => 3 [2] => 1 [3] => 2 [4] => 5 )
Array_sum()
统计数组中元素的和<?php
$arr=array(1,2,3,4,5);
echo array_sum($arr);
Range()
初始化数组用,(最小值,最大值)<?php
$arr=range(4,10);
print_r($arr);
Array ( [0] => 4 [1] => 5 [2] => 6 [3] => 7 [4] => 8 [5] => 9 [6] => 10 )
<?php
$arr=range(24,10);
print_r($arr);
Array ( [0] => 24 [1] => 23 [2] => 22 [3] => 21 [4] => 20 [5] => 19 [6] => 18 [7] => 17 [8] => 16 [9] => 15 [10] => 14 [11] => 13 [12] => 12 [13] => 11 [14] => 10 )
Array_fill()
<?php
$arr=array_fill(4,10,"加油");
print_r($arr);
Array ( [4] => 加油 [5] => 加油 [6] => 加油 [7] => 加油 [8] => 加油 [9] => 加油 [10] => 加油 [11] => 加油 [12] => 加油 [13] => 加油 )