php的数组、排序、查找
-
//创建数组,其值可以放任意的数据类型
$arr[0]=111;
$arr[1]=121;
$arr[2]="nihao";
$arr[3]=141.9;
$arr[4]=null;//null要记入长度,并要占用空间,但是不会输出
echo "数组长度".count($arr);
//遍历数组中的值
for($i=0;$i<count($arr);$i++){
echo "<br/>".$arr[$i];
} - 创建数组的第二种方式
$arr=array('hello','niho',12.3,1);
//遍历数组中的值
for($i=0;$i<count($arr);$i++){
echo "<br/>".$arr[$i];
}
创建数组的第三种方式 【键值的方式】 (在默认情况下,我们的元素下标是从0开始的,但是也可以自己定义) 案例如下:
$arr['logo']="成都";
$arr['add']=123;
...
或者
$arr=array("logo"=>"成都","add"=>123,4=>23); 测试如下:
$arr=array("logo"=>"成都","add"=>123,4=>23);
//遍历数组中的值,foreach这种循环可用于对数组键值对的方式的遍历,也可以用于其他任何方式的数组遍历,foreach可以广泛运用
foreach($arr as $val){
echo $val;//$val['key']可以得到值对应的键
}
foreach($arr as $key => $value){
echo $key.":".$value;
- } $a=array(); 利用foreach($arr as $key => $value){$a[]=$key//向数组a中按照下表0开始赋值}
while循环遍历值
$i=0;
while($i<count($arr)){
echo "数组值".$arr[$i]."<br/>";//echo "$arr[$i]";这在变量上加了一个双引号也是可以打印出值的,但是单引号就会把其当成字符串来打印
$i++;
}
$arr[true]='hello';
alert($arr[1]);//$arr[1]等价于$arr[true];
$arr[null]=123;等价于$arr[""]=123;
- 我们通常使用print_r()和var_dump()来查看数组的情况 print_r($arr);//Array ( [0] => hello [1] => niho [2] => 12.3 [3] => 1 ) var_dump($arr);//array(4) { [0]=> string(5) "hello" [1]=> string(4) "niho" [2]=> float(12.3) [3]=> int(1) }
- 在php中数组的长度是可以自动增长的 案例:
$arr=array(1,2);
$arr[2]="zenjia";//自动给该数组分配了一个空间
echo $arr[2]; -
-
php数组中几个重要的函数 1.count(); //统计数组的长度 2.is_array() //判断一个变量是否是数组 3.print_r()和var_dump(),上面已经注明过了 4.explode()//拆分字符串,例如$arr=explode(",","a,b,c,d");测试:print_r($arr);
-
删除某个数组的键-值对 unset()用于销毁指定变量 ,例如删除一个数组中下标为0的元素,unset($arr[0]); 如果在函数中 unset() 一个全局变量,则只是局部变量被销毁,而在调用环境中的变量将保持调用 unset() 之前一样的值。unset详解请看php手册
-
数组的排序 ①冒泡排序
<?php
function maoPaoSort(&$arr){//红色的符号表示该变量为引用变量,如果没有&这个符号,传过来的数组就会是将传递的数组复制了一个(是另外一个对象,地址不同了,所以你在外层输出的时候,还是未排序的那个数组,在函数里面输出的数组才是排序好了的)
$temp=0; $flag=false;
for($i=0;$i<count($arr)-1;$i++){//count($arr)-1意思是排序好了一个数,就少循环一次
for($j=0;$j<count($arr)-1-$i;$j++){//-$i为了不把经过一次筛选之后排好的数放入下一次排序中
//如果前面的数大于后面的数,就要改变两个数的位置
if($arr[$j]>$arr[$j+1]){
$temp=$arr[$j];//将大的数先预留在这个变量中
$arr[$j]=$arr[$j+1];//将小的数放在大的数的位置
$arr[$j+1]=$temp;//再将预留的大的数放在小的数的位置
}
}if(!$flag){//说明已经是有序的了,就不用到第二层循环了,提高代码的执行效率
break;
}
$flag=false;
}
}$myarr=array(5,0,-1,-100,4444);
maoPaoSort($myarr);
print_r($myarr);
?>②选择排序
<?php
function chooseSort(&$arr){
$temp=0;
for($i=0;$i<count($arr)-1;$i++){//假设当前的值是最小值
$minValue=$arr[$i];
//记录我认为最小值的下标
$minIndex=$i;
for($j=$i+1;$j<count($arr);$j++){//与第二个数进行比较
//如果我认为的最小值大于了第二个数,说明我上面的假设不成立
if($minValue>$arr[$j]){
$minIndex=$j;
}
}
//然后进行交换
$temp=$arr[$i];
$arr[$i]=$arr[$minIndex];
$arr[$minIndex]=$temp;
}}
$myarr=array(5,0,-1,-100,4444);
chooseSort($myarr);
print_r($myarr);?>
③插入排序
<?php
function chaRuSort(&$arr){
//默认下标为0的数已经是有序的了
for($i=1;$i<count($arr);$i++){//所以要从下标为1的数开始比较
//准备要插入的数
$addValue=$arr[$i];
//准备要比较的数的下标
$addIndex=$i-1;
//如果这些条件满足,说明我们还没有找到数字的正确位置
while($addIndex>=0&&$addValue<$arr[$addIndex]){
$arr[$addIndex+1]=$arr[$addIndex];//将大的数往后挪一位
$addIndex--;//再和前一个数做比较,以此类推放值
}
//如果不满足while中的条件就将有序的数插入数组中
$arr[$addIndex+1]=$addValue;
}}
$myarr=array(5,0,-1,-100,4444);
chaRuSort($myarr);
print_r($myarr);?>
④快速排序
- 查找 ❶顺序查找
<?php
function search(&$arr,$findValue){
$flag=false; //用标志确定是否查找到想要的值
for($i=0;$i<count($arr);$i++){
if($arr[$i]==$findValue){
echo "我要查找数的下标是:".$i."<br/>";
$flag=true;
//break;
}
}if(!$flag){
echo "找不到你想要查找的数:".$findValue;
}
}
$myarr=array(12,34,34,5940);
search($myarr,4);?>
❷二分查找<?php
function binarySearch(&$arr,$findValue,$leftIndex,$rightIndex){
//中间数的下标
$centerIndex=($leftIndex+$rightIndex)/2;
if($leftIndex>$rightIndex){
echo "找不到$findValue";
}
if($findValue>$arr[$centerIndex]){
binarySearch(&$arr,$findValue,$centerIndex+1,$rightIndex);//递归调用
}else if($findValue<$arr[$centerIndex]){
binarySearch(&$arr,$findValue,$leftIndex,$centerIndex-1);
}else{
echo "要找的数的下标是$centerIndex";
}
}$myarr=array(12,34,35,36,59,90);
binarySearch($myarr,34,0,count($myarr));?>