<?php
/**
* 1、写函数创建长度为10的数组。数组中的元素为递增的奇数。首项为1。
*/
$ary = range(1, 10);
//Array ( [0] => 1 [1] => 2 [2] => 3 [3] => 4 [4] => 5 [5] => 6 [6] => 7 [7] => 8 [8] => 9 [9] => 10 )
print_r($ary);
/**
* 2、创建长度为10的数组,数组中的元素为递增的等比数,比值为3。首项为1
*/
function myfun($n){
return pow(3, $n-1);
}
$ary = range(1, 10);
$result = array_map('myfun',$ary);
echo '<br>';
//Array ( [0] => 1 [1] => 3 [2] => 9 [3] => 27 [4] => 81 [5] => 243 [6] => 729 [7] => 2187 [8] => 6561 [9] => 19683 )
print_r($result);
/**
* 3、求数组中最大数所在的下标;
* $arr = array(1,5,67,8,4,3,45,6,887,2);
*/
$arr = array(1,5,67,8,4,3,45,6,887,2);
$max = $arr[0];//假设第一个数是最大的
$index = 0;//记录最大数的key值,即下标
foreach ($arr AS $key=>$val) {
if ($max < $val) {
$max = $val;
$index = $key;
}
}
//最大数是:887,其下标是:8
echo '<br>最大数是:'.$max . ',其下标是:' . $index;
/* $mval = max($arr);
echo '<br>';
print_r(array_search($mval, $arr)); */
/**
* 4、创建一个长度为10的数组,数组中的元素满足斐波拉齐数列的规律;
*/
$arr = array(1,1);
for ($i=2; $i<10; $i++) {
$arr[] = $arr[$i-1]+$arr[$i-2];
}
echo '<br>';
//Array ( [0] => 1 [1] => 1 [2] => 2 [3] => 3 [4] => 5 [5] => 8 [6] => 13 [7] => 21 [8] => 34 [9] => 55 )
print_r($arr);
/**
* 5、计算数组中最大数和最小数的差;
*/
$arr = array(1,5,67,8,4,3,45,6,887,2);
/*系统函数简单实现
*
$minv = min($arr);
$maxv = max($arr);
echo '<br>';
echo '最大数是:' . $maxv .',最小数是:'.$minv.',差是:'.($maxv-$minv);
*/
/*不使用系统函数实现*/
$max = $arr[0];//假设第一个数是最大的
$min = $arr[0];//假设第一个数也是最小的
foreach ($arr AS $key=>$val) {
if ($max < $val) {
$max = $val;
} elseif ($min > $val) {
$min = $val;
}
}
echo '<br>';
//最大数是:887,最小数是:1,差是:886
echo '最大数是:' . $max .',最小数是:'.$min.',差是:'.($max-$min);
/**
* 6、写一个方法,将一个长度超过10的数组最后5项直接截取,不改变顺序直接变为前5项,
* 如{1,2,3,4,5,6,7,8,9,10,11,12}在经过方法后变为:{8,9,10,11,12,1,2,3,4,5,6,7}
*/
function arrayHandel(&$ary, $count = 5) {
if (!(is_array($ary) && count($ary)>10 && count($ary)>$count)) {
return false;
}
$len = count($ary);
while ($count>0) {
$i = $len-1;
$count--;
array_unshift($ary, $ary[$i]);
array_pop($ary);
}
}
$array = array(1,2,3,4,5,6,7,8,9,10,11,12,13);
echo '<br>';
arrayHandel($array);
//Array ( [0] => 9 [1] => 10 [2] => 11 [3] => 12 [4] => 13 [5] => 1 [6] => 2 [7] => 3 [8] => 4 [9] => 5 [10] => 6 [11] => 7 [12] => 8 )
print_r($array);
/**
*
* 7、将两个数组连接成一个新数组;
* array_combine($keys, $values) 一个作键,一个作值,但是两个数组个数必须一致,不然会返回false
* array_merge($array1) 覆盖相同的键名
* array_merge_recursive($array1) 不覆盖相同键名,组成以键名组成的数组集合
*
*/
$arr1 = array('a'=>123,'b'=>1234);
$arr2 = array('os'=>'linux','db'=>'mysql','language'=>'php','server'=>'nginx','b'=>1256);
echo '<br>';
//Array ( [a] => 123 [b] => 1234 [os] => linux [db] => mysql [language] => php [server] => nginx )
print_r($arr1+$arr2);//$arr1会覆盖$arr2中相同键值,运算是从右至左,所以左边的覆盖右边
echo '<br>';
//boolean false
var_dump(array_combine($arr1,$arr2));//boolean false
echo '<br>';
//Array ( [a] => 123 [b] => 1256 [os] => linux [db] => mysql [language] => php [server] => nginx )
print_r(array_merge($arr1,$arr2));//$arr1和$arr2中的相同的元素被后一个$arr2的覆盖
echo '<br>';
//Array ( [a] => 123 [b] => Array ( [0] => 1234 [1] => 1256 ) [os] => linux [db] => mysql [language] => php [server] => nginx )
print_r(array_merge_recursive($arr1,$arr2));
/**
* 数组逆序(不能直接使用rsort函数,不能生成新数组);
*/
$ary = array('apple','juice','orange','85','0','app','1','2','5','z');
/* rsort($ary);
echo '<br>';
print_r($ary); */
for ($i=0;$i<count($ary);$i++){
for ($j=$i+1;$j<count($ary);$j++){
if($ary[$i]<$ary[$j]){
$temp = $ary[$i];
$ary[$i] = $ary[$j];
$ary[$j] = $temp;
}
}
}
echo '<br>';
//Array ( [0] => z [1] => orange [2] => juice [3] => apple [4] => app [5] => 85 [6] => 5 [7] => 2 [8] => 1 [9] => 0 )
print_r($ary);
/**
* 9、在长度为10的升序有序数组中插入一个数字,组成新数组,保证数组顺序(不能直接使用sort)
*/
$arr = range(1, 40, 2);
function insertAry($ary, $val) {
$endAry = array();
$len = count($ary);
$index = 0;
if ($ary[$len-1] < $val) {//若插入数比数组中任意数大
$ary[] = $val;
$endAry = $ary;
return $endAry;
}
while ($index<$len) {
if ($ary[$index]>=$val){
$endAry[$index++] = $val;
for($i = $index;$i<$len+1;$i++){
$endAry[$i] = $ary[$i-1];
}
break;
} else {
$endAry[$index] = $ary[$index];
}
$index++;
}
return $endAry;
}
echo '<br>';
//Array ( [0] => 1 [1] => 3 [2] => 5 [3] => 7 [4] => 9 [5] => 11 [6] => 13 [7] => 15 [8] => 17 [9] => 19 [10] => 21 [11] => 23 [12] => 25
//[13] => 27 [14] => 29 [15] => 31 [16] => 33 [17] => 35 [18] => 37 [19] => 39 [20] => 88 )
print_r(insertAry($arr,88));
/**
* 10、将一个无序数组排列成升序数组;(冒泡排序)
*/
$arr = array(888,-9,1,11,5,67,8,4,3,45,6,887,2);
$len = count($arr);
for ($i=0; $i<$len; $i++) {
for ($j=$len-1; $j>$i; $j--) {
if ($arr[$j]<$arr[$j-1]) {
$temp = $arr[$j];
$arr[$j] = $arr[$j-1];
$arr[$j-1] = $temp;
}
}
}
echo '<br>';
//Array ( [0] => -9 [1] => 1 [2] => 2 [3] => 3 [4] => 4 [5] => 5 [6] => 6 [7] => 8 [8] => 11 [9] => 45 [10] => 67 [11] => 887 [12] => 888 )
print_r($arr);
/*********选择排序************/
$arr = array(888,-9,1,11,5,67,8,4,3,45,6,887,2);
for ($i=0; $i<$len; $i++) {
for ($j=$i+1; $j<$len; $j++) {
if ($arr[$j]<$arr[$i]) {
$temp = $arr[$j];
$arr[$j] = $arr[$i];
$arr[$i] = $temp;
}
}
}
echo '<br>';
//Array ( [0] => -9 [1] => 1 [2] => 2 [3] => 3 [4] => 4 [5] => 5 [6] => 6 [7] => 8 [8] => 11 [9] => 45 [10] => 67 [11] => 887 [12] => 888 )
print_r($arr);
/**
* 11、对有序数组进行洗牌操作;(不能直接使用shuffle函数)
*/
$arr = range(1, 40, 2);
echo '<br>';
echo '<br>$arr打乱前:';
//$arr打乱前:Array ( [0] => 1 [1] => 3 [2] => 5 [3] => 7 [4] => 9 [5] => 11 [6] => 13 [7] => 15 [8] => 17 [9] => 19 [10] => 21 [11] => 23
//[12] => 25 [13] => 27 [14] => 29 [15] => 31 [16] => 33 [17] => 35 [18] => 37 [19] => 39 )
print_r($arr);
function shuffleDemo($arr) {
$resultAry = array();
$len = count($arr);
while ($len>0) {
$index = rand(0, $len-1);
$resultAry[] = $arr[$index];
array_splice($arr, $index,1);
$len--;
}
return $resultAry;
}
echo '<br>';
echo '<br>$arr打乱后:';
//$arr打乱后:Array ( [0] => 3 [1] => 33 [2] => 11 [3] => 15 [4] => 5 [5] => 39 [6] => 1 [7] => 25 [8] => 35 [9] => 29 [10] => 13 [11] => 27
//[12] => 23 [13] => 7 [14] => 37 [15] => 19 [16] => 9 [17] => 17 [18] => 31 [19] => 21 )
print_r(shuffleDemo($arr));
/**
* 12、删除数组中指定位置的元素;(参考unset函数)
*/
function deleteAryElement(&$arr, $index){
if (!(is_array($arr) && count($arr)>$index)) {
return false;
}
unset($arr[$index]);
}
$arr = array(888,-9,1,11,5,67,8,4,3,45,6,887,2);
deleteAryElement($arr,2);
echo '<br>';
//Array ( [0] => 888 [1] => -9 [3] => 11 [4] => 5 [5] => 67 [6] => 8 [7] => 4 [8] => 3 [9] => 45 [10] => 6 [11] => 887 [12] => 2 )
print_r($arr);
/**
* 13、将数组中素数删除组成新数组
*/
function filtFun($val) {//自定义过滤素数函数
$flag = true;//判断是否是素数
if (is_int($val)) {
if ($val<=0) {
$flag = false;
}
for ($i=$val-1;$i>1;$i--) {
if ($val%$i==0) {
$flag = false;
break;
}
}
} else {
$flag = false;
}
return !$flag;
}
$arr = array(888,-9,1,11,5,67,8,4,3,45,6,887,2,'a');
$rary = array_filter($arr, 'filtFun');
echo '<br>';
//Array ( [0] => 888 [1] => -9 [6] => 8 [7] => 4 [9] => 45 [10] => 6 [13] => a )
print_r($rary);
/**
* 14、写函数检查数组中是否存在某个元素(不能直接使用in_array)
*/
function exsitEle($arr, $value) {
if (!(is_array($arr) && count($arr)>0)) {
return false;
}
foreach ($arr AS $key=>$val) {
if ($val==$value) {
return true;
}
}
return false;
}
$arr = array(888,-9,1,11,5,67,8,4,3,45,6,887,2,'a',array('a'=>14,'b'=>48));
//boolean true
var_dump(exsitEle($arr, array('a'=>14,'b'=>48)));
/**
* 15、写函数,向数组最后追加一个元素(不能直接使用array_push)
*/
$arr = array(888,-9,1,11,5,67,8,4,3,45,6,887,2,'a',array('a'=>14,'b'=>48));
$arr[] = 'abcd';
echo '<br>';
//Array ( [0] => 888 [1] => -9 [2] => 1 [3] => 11 [4] => 5 [5] => 67 [6] => 8 [7] => 4 [8] => 3 [9] => 45 [10] => 6
//[11] => 887 [12] => 2 [13] => a [14] => Array ( [a] => 14 [b] => 48 ) [15] => abcd )
print_r($arr);
/**
* 16、写函数,求数组中所有元素之和(不能直接使用array_sum)
*/
$arr = array(888,-9,1,11,5,67,8,4,3,45,6,-102);
function countAry($arr) {
if (!(is_array($arr) && count($arr)>0)) {
return false;
}
$sum = 0;
foreach ($arr AS $key=>$val) {
$sum += $val;
}
return $sum;
}
echo '<br>';
//927
print_r(countAry($arr));
php数组功能非常强大,自己对php数组的练习学习。以后也可以在此加深印象,巩固学习!