15.PHP数组学习

/*
* 1. 一个数组中存的是多个内容,数组中的内容叫作 “元素”
*
* 2. 每个元素都是由 键和值 组成的 key/ value key就是下标
*
* $a = array("one"=>"11111111", "two"=>"222222222");
*
* 3. 就是通过 key 使用值
*
* 下标有两种类型: 一种是整数(索引数组), 一种是字符串(关联数组)
*
* 4 . 用[]来操作下标, 也可以使用{}进行互换, 建议使用[]来指定下标
*
* 5. 在使用下标时,如果是关联数组, 一定要使用引号(字符串外加引号), 不要使用常量名称
*
* 6. 数组的自动增涨下标(索引数组), 默认是从0开始的, 自动增涨的都是出现过的最大值加1
*
* 7. 关联数组的字符串下标, 不会影响索引下标的排列规则!
*
* 8. 使用array()函数声明数组, 默认是索引的下标, 是从0开始
*
* 9. 使用 => 符号指定下标
*
* 10. 删除数组中的一个元素使用unset(),删除下标和值,下标不会重新索引,需要使用array_values()函数重新索引
*/
//10
$array = array( "size" => "XL" , "color" => "gold" );
print_r ( array_values ( $array ));

/*
* 使用for遍历数组
*
* 优点:
*
* 效率很高, 就是数组访问方式, 只不过通过循环去取值
*
* count(数组) 获取数组的长度, 是数组的实际元素的个数
*
* 不足:
* 1. 数组下标必须是连续的,不连续会有notice(注意)
*
* 2. 关联数组(下标是字符串)用for不能遍历出值
*/

$arr = array("aa", "bb", "cc", "dd", 9=>"ee", "ff", "ggg", "hh");

$nums = count($arr); //8

$nums = 13;

for($i=0; $i < $nums; $i++) {
echo $arr[$i].'<br>';

}
/*
foreach() 语法

1.
foreach(数组 as 自定义变量) {

}

一、 数组有多少个元素, foreach就循环多少次
二、foreach会将数组中的元素 在每次循环中, 依次将元素的值给自定义的变量,
在每次循环中用到这个变量,即用到了当前的数组中的元素

2.
foreach(数组 as 下标变量 => 值变量){
}
*/
$arr = array( "bb", "three"=>"cc", "dd", 9=>"ee", "ff", "four"=>"ggg", "hh");
foreach($arr as $kk => $vv) {
echo "{$kk}======>{$vv}<br>";
}
//当值变量为数组时
$group = [
"school"=>"浙江理工大学",
"num"=>38888,
["name"=>"a", "age"=>20, "sex"=>"男", "email"=>"aaa@bbb.com"],
["name"=>"b", "age"=>21, "sex"=>"女", "email"=>"bbb@bbb.com"],
["name"=>"c", "age"=>21, "sex"=>"女", "email"=>"ccc@ccc.com"],
["name"=>"d", "age"=>21, "sex"=>"女", "email"=>"ddd@ddd.com"]
];

echo '<table border="1" width="800" align="center">';
echo '<caption><h1>数组转为表格<h1></caption>';
foreach($group as $k=>$row) {
echo '<tr>';
if(is_array($row)) { //判断是否为数组
foreach($row as $col) {
echo '<td>'.$col.'</td>';
}
} else {
echo '<td colspan="4">'.$k.':'.$row.'</td>';
}

echo '</tr>';
}
echo '</table>';

/*
* list() 函数 但这个函数和其它函数用法不同
*
* 作用: 将数组中的元素转为变量使用
*
* 1. 等号左边使用list()函数, 等号右边只能是一个数组
*
* 2. 数组中有几个元素, 在list()中就用几个参数,而且参数必数是变量(新声明的自定义变量), 不能是值
*
* 3. 只能将索引数组(下标是连续), 转为变量, 是按下标0开始找的
*
* 4. 可以在list()参数中通过,空项选择性的接收数组中的元素
*
*/
list($a, , $c) = array("windows", "32位", "64位");

echo $a."<br>";
// echo $b."<br>";
echo $c."<br>";

$str="windows_linux";

list($w,$l) = explode("_", $str);

echo $w.'<br>';
echo $l.'<br>';

/*
*数组指针的移动
*
* key() 获取当前下标
* current() 获取当前的值
* each() --- next()
*/
$arr = array("one"=>"aaa", "two"=>"bbb", "three"=>"ccc", "four"=>"ddd", "5"=>"eee");

echo "<pre>";
print_r($arr);
echo "</pre>";
echo '默认值在$arr[0]位置<br>';
next($arr);
next($arr); //下一位

//end($arr); //最后一位
//prev($arr); //上一位
//reset($arr); //默认位置

echo "当前的位置: ".key($arr)."=>".current($arr)."<br>";

//each()
$foo = array( "bob" , "fred" , "jussi" , "jouni" , "egon" , "marliese" );
$bar = each ( $foo );
print_r ( $bar );

/*输出如下
Array
(
[1] => bob
[value] => bob
[0] => 0
[key] => 0
)
*/

/*
* 超全局数组(变量)(属于预定义变量), 在PHP的脚本中, 已经声明的变量, 你可以直接就去使用即可!
*以下是全部的超全局数组(变量):
* $_SERVER //服务器和执行环境信息
* $_ENV //通过环境方式传递给当前脚本的变量的 数组 。
* $_GET //通过 URL 参数传递给当前脚本的变量的数组。
* $_POST //通过 HTTP POST 方法传递给当前脚本的变量的数组。
* $_REQUEST //默认情况下包含了 $_GET ,$_POST 和 $_COOKIE 的 数组 。
* $_FILES //通过 HTTP POST 方式将文件上传到当前脚本的项目的 数组
* $_COOKIE //通过 HTTP Cookies 方式传递给当前脚本的变量的 数组 。
* $_SESSION //当前脚本可用 SESSION 变量的数组
* $GLOBALS // 引用全局作用域中可用的全部变量
*
* 超 全局 数组
*
* 1. 数组(关联数组), 就和你自己声明的数组是一样的操作方式
* 2. 全局
*/
echo count($_SERVER);

foreach($_SERVER as $key => $value) {
echo "{$key} => {$value} <br>";
}

//get url参数
<a href="demo.php?action[]=add&action[]=mod&id=5&name=admin">测试页面</a>
//http post
<form action="demo.php" method="post">
username: <input type="text" name="name[one]" /><br>
age: <input type="text" name="age" /> <br>
<input type="submit" name ="sub" value="提交">
</form>

//array_keys() array_values
$lamp = array("os"=>"Linux", "webserver"=>"Apache", "ws"=>"nginx", "num"=>10, "aa"=>"10", "db"=>"MySQL", "language"=>"PHP");

print_r($lamp);
echo '<br>';

list($os, $webserver, $db, $language) = array_values($lamp); //按数组的顺序来,一一对应

echo $os."<br>";
echo $webserver."<br>";
echo $db."<br>";
echo $language."<br>";

echo "<pre>";
print_r( array_keys($lamp) ); // 全部返回所有键名
echo "</pre>";
print_r( array_keys($lamp, 10, false) ); //值包含10的键会被返回
echo "<br>";
print_r( array_keys($lamp, 10, true) ); //判断在搜索的时候是否该使用严格的比较(===)

//array_key_exists()
if( array_key_exists("os", $lamp) ) {
echo "在数组中";
}else{
echo "不在数组中";
}

/*
* array_flip ($arr)
*
* 返回一个反转后的 array ,键和值交换
* 需要合法的键名,例如需要是 integer 或者 string
*/

$trans = array( "a" => 1 , "b" => 1 , "c" => 2 ); //后面的值会将前面的覆盖
$trans = array_flip ( $trans );
print_r ( $trans );

//现在 $trans 是:
/*
Array
(
[1] => b
[2] => c
)
*/

/*
* int count( mixed $var [, int $mode = COUNT_NORMAL ])
* $var 数组或者对象
* $mode 参数设为 COUNT_RECURSIVE (或 1),
* count() 将递归地对数组计数。对计算多维数组的所有单元尤其有用。$mode 的默认值是 0。
*/
$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 array_filter ( array $array [, callable $callback [, int $flag = 0 ]] )
*
*用回调函数过滤数组中的单元
*
*依次将 input 数组中的每个值传递到 callback 函数。如果 callback 函数返回 TRUE ,
*则 input 数组的当前值会被包含在返回的结果数组中。数组的键名保留不变。
*
*/
$arr = array(1,2,3,-4,false,5,6,7,8,9,"",-1-2-3,4,null,-5-6-7-8, 0);

function myfun($value) {
if($value >= 0)
return true;
else
return false;
}

var_dump(array_filter($arr, "myfun"));

//使用匿名函数
var_dump( array_values( array_filter($arr,function($value){
return !($value%2==0);

}) ));

/*
* bool array_walk ( array &$array , callable $funcname [, mixed $userdata = NULL ] )
*
* 将用户自定义函数 funcname 应用到 array 数组中的每个单元。
*
* 如果 funcname 需要直接作用于数组中的值,则给 funcname 的第一个参数指定为引用。
* 这样任何对这些单元的改变也将会改变原始数组本身。
*
* array_walk() 不会受到 array 内部数组指针的影响。
* array_walk() 会遍历整个数组而不管指针的位置。
*/
$fruits = array( "d" => "lemon" , "a" => "orange" , "b" => "banana" , "c" => "apple" );

function test_alter (& $item1 , $key , $prefix ) //注意"&"
{
$item1 = " $prefix : $item1 " ;
}

function test_print ( $item2 , $key )
{
echo " $key . $item2 <br />\n" ;
}

echo "Before ...:\n" ;
array_walk ( $fruits , 'test_print' );

array_walk ( $fruits , 'test_alter' , 'fruit' );
echo "... and after:\n" ;

array_walk ( $fruits , 'test_print' );

/*
以上例程会输出:

Before ...:
d. lemon
a. orange
b. banana
c. apple
... and after:
d. fruit: lemon
a. fruit: orange
b. fruit: banana
c. fruit: apple
*/

/*
* array array_map ( callable $callback , array $arr1 [, array $... ] )
* array_map() 返回一个数组,该数组包含了 arr1 中的所有单元经过 callback 作用过之后的单元。
* callback 接受的参数数目应该和传递给 array_map() 函数的数组数目一致。
*/
function cube ( $n )
{
return( $n * $n * $n );
}

$a = array( 1 , 2 , 3 , 4 , 5 );
$b = array_map ( "cube" , $a );
print_r ( $b );
/*
这使得 $b 成为:

Array
(
[0] => 1
[1] => 8
[2] => 27
[3] => 64
[4] => 125
)
*/
//例2
$arr = array(1,2,3,4,5);
$brr = array("one", "two", "three");
$crr= array("aa", "bb", "cc", "dd");

$rarr = array_map(null, $arr, $brr, $crr);

echo '<pre>';
print_r($rarr);
echo '</pre>';

/*
Array
(
[0] => Array
(
[0] => 1
[1] => one
[2] => aa
)

[1] => Array
(
[0] => 2
[1] => two
[2] => bb
)

[2] => Array
(
[0] => 3
[1] => three
[2] => cc
)

[3] => Array
(
[0] => 4
[1] =>
[2] => dd
)

[4] => Array
(
[0] => 5
[1] =>
[2] =>
)
)
*/

/*
*array_merge()
*
* 将一个或多个数组的单元合并起来,一个数组中的值附加在前一个数组的后面。
* 返回作为结果的数组。
*
* 如果输入的数组中有相同的字符串键名,则该键名后面的值将覆盖前一个值。
*
* 如果数组包含数字键名,后面的值将不会覆盖原来的值,而是附加到后面。
*
* 如果只给了一个数组并且该数组是数字索引的,则键名会以连续方式重新索引。
*/

$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
)
*/

/*快速排序法*/
$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];
}
}

$left=qsort($left);
$right=qsort($right);

return array_merge($left, $key, $right);
}

posted @ 2016-05-02 18:32  MatthewBlog  阅读(113)  评论(0编辑  收藏  举报

页脚