題目 1:建立長度 10、首項 1 的遞增奇數陣列
function arrOdd($len=10, $first=1) {
$arr = [];
for ($i=0; $i<$len; $i++) $arr[] = $first + $i*2;
return $arr;
}
print_r(arrOdd()); // [1,3,5,7,9,11,13,15,17,19]
題目 2:建立長度 10、首項 1、公比 3 的等比數列
function arrGeo($len=10, $first=1, $ratio=3) {
$arr = [];
for ($i=0; $i<$len; $i++) $arr[] = $first * pow($ratio, $i);
return $arr;
}
print_r(arrGeo()); // [1,3,9,27,81,243,729,2187,6561,19683]
題目 3:求陣列最大值的索引(鍵)
function maxKey($arr) {
$maxVal = max($arr);
foreach ($arr as $k => $v) if ($v == $maxVal) return $k;
}
$arr = [0,-1,-2,5,'b'=>15,3];
echo maxKey($arr); // b
題目 4:費波那契數列(前 10 項)
function fibo($len) {
$f = [0,1];
for ($i=2; $i<$len; $i++) $f[$i] = $f[$i-1] + $f[$i-2];
return $f;
}
print_r(fibo(10)); // [0,1,1,2,3,5,8,13,21,34]
題目 5:陣列最大值與最小值的差
function rangeDiff($arr) {
return max($arr) - min($arr);
}
// 或排序法
function rangeDiffSort($arr) {
sort($arr); $min = $arr[0];
rsort($arr); $max = $arr[0];
return $max - $min;
}
echo rangeDiff([-1,-2,100]); // 102
題目 6:陣列旋轉(後 5 移至前 5,長度>10)
function rotate5($arr) {
$n = count($arr);
if ($n <= 10) die('長度需>10');
return array_merge(array_slice($arr, -5), array_slice($arr, 0, -5));
}
$arr = ['a'=>1,2,3,8,9,6,'b'=>5,-1,'c'=>8,0,7];
print_r(rotate5($arr));
題目 7:兩陣列合併三種方式差異
$a = ['a'=>1,'b'=>2,3];
$b = ['a'=>'Dee',3,5];
// array_merge:數字鍵重設,字串鍵後者覆蓋
print_r(array_merge($a,$b));
// array_merge_recursive:衝突鍵遞歸合併為陣列
print_r(array_merge_recursive($a,$b));
// 手動迴圈:保留所有鍵,數字鍵重設
$c = $a;
foreach ($b as $v) $c[] = $v;
print_r($c);
題目 8:原地反轉陣列(不建立新陣列、不用 rsort)
function reverseInPlace(&$arr) {
$len = count($arr);
$half = (int)($len/2);
for ($i=0; $i<$half; $i++) {
$j = $len - 1 - $i;
$tmp = $arr[$i];
$arr[$i] = $arr[$j];
$arr[$j] = $tmp;
}
}
$arr = ['a','b','c',1,10];
reverseInPlace($arr);
print_r($arr); // [10,1,'c','b','a']