数组是一个容器, 使用的目的是可以批量操作


数组的分类:

PHP 中的数组实际上是一个有序图。图是一种把 values 映射到 keys 的类型。此类型在很多方面做了优化,因此可以把它当成真正的数组来使用,或列表(矢量),散列表(是图的一种实现),字典,集合,栈,队列以及更多可能性。因为可以用另一个 PHP 数组作为值,也可以很容易地模拟树。 

所谓的数组下标可以视为资料内容在此数组中的识别名称,通常被称为数组下标。
当索引值为数值时,也代表此资料内容在数组中的储存位置。
数组中有几个索引值就被称为几维数组。
数组分类:
在PHP中有两种数组:索引数组和关联数组。
索引(indexed)数组的索引值是整数,以0开始。当通过位置来标识东西时用索引数组。
关联(associative)数组以字符串做为索引值,关联数组更像操作表。索引值为列名,用于访问列的数据。


数组的定义:

直接赋值的方式声明数组
使用array( )语言结构新建数组
PHP4的新型声明方式[]
多维数组的声明


数组常用的赋值方式:
由于 PHP 是属于弱类型数据,因此源代码中的数组并不需要经过特别的声明操作,直接将一组数值指定给某一数组元素即可。一般情况下数组的赋值有两种方式:
直接赋值方式 如:
$a[0]=‘spam@126.com’;  
$a[1]=‘abuse@sohu.com’;
使用array函数 如:
$a=array(“spam@126.com “,”abuse@sohu.com”);

方括号和花括号可以互换使用来访问数组单元(例如 $array[42] 和 $array{42} 在上例中效果相同)


直接赋值格式:
$数组变量名[索引值]=资料内容
其中索引值(下标)可以是一个字符串或一个整数。等价于整数(不以0开头)的字符串值被当作整数对待。因此,数组$array[3]与$array[‘3’]是引用相同的元素。但是$array[‘03’]引用的另外不同的元素。
一维数组
数组中索引值(下标)只有一个的数组称为一维数组。在数组中这是最简单的,也是最常用的了。

<?php
    $contact1[0] = 1;
    $contact1[1] = "高某";
    $contact1[2] = "A公司";
    $contact1[3] = "北京市";
    $contact1[4] = "(010)98765432";
    $contact1[5] = "gao@brophp.com";

    $contact2["ID"] = 2;
    $contact2["姓名"] = "峰某";
    $contact2["公司"] = "B公司";
    $contact2["地址"] = "上海市";
    $contact2["电话"] = "(021)12345678";
    $contact2["EMAIL"] = "feng@lampbrother.com";

    print_r( $contact1 );      //输出数组$contact1中所有元素的下标和值
    var_dump( $contact1 ); //输出数组$contact1中所有元素的下标和值同时输出每个元素的类型
     print_r( $contact2 );      //输出数组$contact2中所有元素的下标和值
    var_dump( $contact2 ); //输出数组$contact2中所有元素的下标和值同时输出每个元素的类型

<?php
    $contact[ ] = 1                         //索引下标为 0
    $contact[ ] = "高某";                 //索引下标为 1
    $contact[ ] = "A公司";                    //索引下标为 2
    $contact[ ] = "北京市";                  //索引下标为 3

    $contact[0] = 1                     //声明数组使用的下标为整数0
    $contact["ID"] = 1                  //声明数组使用的下标为字符串
    $contact[1] = "高某";             //使用下标为整数1向数组中添加元素
    $contact["姓名"] = "峰某";          //使用下标为字符串“姓名”向数组中添加元素
    $contact[2] = "A公司";            //使用下标为整数2向数组中添加元素
    $contact["公司"] = "A公司";         //使用下标为字符串“公司”向数组中添加元素

    $contact[ ] = 1;                        //默认的下标为 0
    $contact[14] = "高某";                //指定非连续的下标为 14
    $contact[ ] = "A公司";                    //将紧跟最高的下标值增1后的下标为 15
    $contact[ ] = "北京市";                  //下标再次增1为 16
    $contact[14] = "(010)98765432";  //前面已声明过下标为14的元素,重新为下标14元素赋值
    $contact[ ] = "gao@brophp.com";         //还会紧跟最高的下标值增1后的下标为 17

 array( [key =>] value , ... ) 

   // key 可以是 integer 或者 string 
   // value 可以是任何值 
key 可以是 integer 或者 string。value 可以是任意类型。 

应该始终在用字符串表示的数组索引上加上引号。例如用 $foo['bar'] 而不是 $foo[bar]。否则虽然能用,但是效率低

此外 key 会有如下的强制转换:

    包含有合法整型值的字符串会被转换为整型。例如键名 "8" 实际会被储存为 8。但是 "08" 则不会强制转换,因为其不是一个合法的十进制数值。
    浮点数也会被转换为整型,意味着其小数部分会被舍去。例如键名 8.7 实际会被储存为 8。
    布尔值也会被转换成整型。即键名 true 实际会被储存为 1 而键名 false 会被储存为 0。
    Null 会被转换为空字符串,即键名 null 实际会被储存为 ""。
    数组和对象不能被用为键名。坚持这么做会导致警告:Illegal offset type。

如果在数组定义中多个单元都使用了同一个键名,则只使用了最后一个,之前的都被覆盖了。

如果对给出的值没有指定键名,则取当前最大的整数索引值,而新的键名将是该值加一。如果指定的键名已经有了值,则该值会被覆盖。  

<?php
        $a=array(1,2,3,4,5,6);
        $b=array("one", "two", "three");
        $c=array(0=>"aaa",1=>"bbb",2=>"ccc");
        $d=array("aaa",6=>"bbb","ccc");
        $e=array("name"=>"zhang", "age"=>20);
    ?>

//自 5.4 起可以使用短数组定义语法,用 [] 替代 array()。 


<?php
	$array = array(
  		  "foo" => "bar",
  		  "bar" => "foo",
		);

// 自 PHP 5.4 起
	$array = [
 		   "foo" => "bar",
 		   "bar" => "foo",
	];
?>

自 PHP 5.4 起可以用数组间接引用函数或方法调用的结果。之前只能通过一个临时变量。 
<?php
function getArray() {
    return array(1, 2, 3);
}

// on PHP 5.4
$secondElement = getArray()[1];

// previously
$tmp = getArray();
$secondElement = $tmp[1];

unset() 函数允许删除数组中的某个键。但要注意数组将不会重建索引。如果需要删除后重建索引,可以用 array_values() 函数。

视频中给出的约瑟夫环是在low爆了,完全就是为了用php的某些函数而非得用==

想拽一下并没有写对

参考博客:http://9iphp.com/web/php/1112.html

<?php
function killMonkey($monkeys , $m , $current = 0){
    $number = count($monkeys);
    $num = 1;
    if(count($monkeys) == 1){
        echo $monkeys[0]."成为猴王了<br/>";
        return;
    }
    else{
        while($num++ < $m){
            $current++ ;
            $current = $current%$number;
        }
        echo $monkeys[$current]."的猴子被踢掉了<br/>";
        array_splice($monkeys , $current , 1);
        killMonkey($monkeys , $m , $current);
    }
}
$monkeys = array(1 , 2 , 3 , 4 , 5 , 6 , 7, 8 , 9 , 10); //monkeys的编号
$m = 3; //数到第几只猴子被踢出
killMonkey($monkeys , $m);

function yuesefu($n,$m) {  
    $r=0;  
    for($i=2; $i<=$n; $i++) {
        $r=($r+$m)%$i;  
    }
    return $r+1;  
}  
echo yuesefu(10,3)."是猴王";


二维数组

<?php
	$group=array(
		array("name"=>"zc","age"=>"14","sex"=>"female"),
		array("name"=>"ls","age"=>"32","sex"=>"male"));
	var_dump($group[1]);

看起来很简单的样纸~还是自己打一遍吧
也要学会【】的写法
<?php
	$class=[
		"group"=>[
			["name"=>"zc","age"=>20,"sex"=>"male"],
			["name"=>"zc","age"=>20,"sex"=>"male"]
		],
		[
			["name"=>"zc","age"=>20,"sex"=>"male"],
			["name"=>"zc","age"=>20,"sex"=>"male"]
		]
	];
	echo $class[0][1]['age'];
	echo '<pre>';
	print_r($class);
	echo '</pre>';

<pre></pre>是全部输出 单引号解析 双引号不解析 单引号快

数组的遍历

使用for语句循环遍历数组
使用foreach语句遍历数组
联合使用list( )、each( )和while循环遍历数组
使用数组的内部指针控制函数遍历数组

for循环输出数组

<?php
/*
 *   使用for遍历数组
 *
 *
 *   保证数组: 一定要是下标连续的索引数组
 *
 * 优点:
 *
 *   效率很高, 就是数组访问方式, 只不过通过循环去取值
 *
 *   count(数组) 获取数组的长度, 是数组的实际元素的个数
 *
 *不足:
 	1. 数组下标不一定是连续的
 *	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

foreach循环结构:
foreach 仅用于数组,有两种语法。
foreach (array_expression as $value) 
…..statement
foreach (array_expression as $key => $value) …..statement

综合案例(神奇的发现前端的写法在php中用的非常顺啊)

<?php
	$group=[
		"name"=>"第三组","price"=>888,
		["name"=>"zs","age"=>20,"sex"=>"male","email"=>"aaa@bbb.com"],
		["name"=>"ls","age"=>21,"sex"=>"female","email"=>"www@nnn.com"]
	];
	echo '<table border="1" width="800" align="center">';
	echo '<caption><h1>数组转成表格</h1></caption>';//h1??这里有没有/都可以,标题结束标签可以不写"/"
	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>';

输出这:

数组转成表格

name:第三组 price:888 zs 20 male aaa@bbb.com ls 21 female www@nnn.com

联合使用list( )、each( )和while循环遍历数组

array  each ( array array)
 返回 array 数组中当前指针位置的键/值对并向前移动数组指针。键值对被返回为四个单元的数组,键名为 0,1,key 和 value。单元 0 和 key 包含有数组单元的键名,1 和 value 包含有数据。
 如果内部指针越过了数组的末端,则 each() 返回 FALSE。 
each() 经常和list( ) 结合使用来遍历数组。

1、返回的值是一个数组,数组固定有4个元素,而下标也是固定的:1(值) value(值) 0(下标) key(下标)

2、each()只能处理当前元素的,将当前元素(默认当前元素是第一个元素,指针指向第一个)转成数组信息,处理完毕后,指针向下一个元素移动

3、如果已经在结束位置了,再使用each()获取元素,返回false;

void list ( mixed ...)
它不是真正的函数,而是语言结构。list() 用一步操作给一组变量进行赋值。 
  注: list() 仅能用于数字索引的数组并假定数字索引从0开始。
在执行 each() 之后,数组指针将停留在数组中的下一个单元或者当碰到数组结尾时停留在最后一个单元。如果要再用 each 遍历数组,必须使用reset( )。

list:

<?php
 /*
 *
 *  list() 函数 但这个函数和其它函数用法不同
 *
 *
 *  作用: 将数组中的元素转为变量使用
 *
 *   1. 等号左边使用list()函数, 等号右边只能是一个数组
 *
 *   2. 数组中有几个元素, 在list()中就用几个参数,而且参数必数是变量(新声明的自定义变量), 不能是值
 *
 *   3. 只能将索引数组(下标是连续), 转为变量, 是按下标0开始找的
 *
 *   4. 可以在list()参数中通过,空项选择性的接收数组中的元素
 *
 */
	list($a,,$c)=array("算法","php","Linux","要学不完了");
	echo $a."<br>";
	echo $c."<br>";
	
	$str="MissZhou_会挣很多很多钱_会的会的";
	list($name,$pro,$v5)=explode("_",$str);
	echo $name.'<br>';
	echo $pro.'<br>';
	echo $v5;

each:
<?php
	$arr=["one"=>"MissZhou","fighting","reward","bat"];
	while($tmp=each($arr)){
		echo "{$tmp['key']}=>{$tmp['value']}<br>";
		echo "{$tmp[0]}=>{$tmp[1]}<br>";
		
	}
左侧改成list
<?php
	$arr=["one"=>"MissZhou","fighting","reward","bat"];
	while(list($key,$val)=each($arr)){
		echo "{$key}=>{$val}<br>";
		
	}
输出:

one=>MissZhou
0=>fighting
1=>reward
2=>bat

但是Each到结尾就返回false了,肿么破


<?php
	$arr=["one"=>"MissZhou","fighting","reward","bat"];
	while(list($key,$val)=each($arr)){
		echo "{$key}=>{$val}<br>";
		
	}
	reset($arr);//移动指针到最前面
	$arr=["one"=>"MissZhou","fighting","reward","bat"];
	while(list($key,$val)=each($arr)){
		echo "{$key}=>{$val}<br>";
		
	}



list+each:

<?php
	$contact=array("id"=>1,"name"=>"MissZhou","school"=>"nefu","address"=>"harbin");
	$id=each($contact);
	print_r($id);

	$name=each($contact);
	print_r($name);

	$info=array('coffee','brown','caf');
	list($drink,$color,$power)=$info;
	echo "$drink is $color and $power makes it better.\n";
	
	list(,,$power)=$info;
	echo "i need $power";
	

输出: Array ( [1] => 1 [value] => 1 [0] => id [key] => id ) Array ( [1] => MissZhou [value] => MissZhou [0] => name [key] => name ) coffee is brown and caf makes it better. i need caf

所以上面那个输出表格的就可以改写成:

<?php
	$group=[
		"name"=>"第三组","price"=>888,
		["name"=>"zs","age"=>20,"sex"=>"male","email"=>"aaa@bbb.com"],
		["name"=>"ls","age"=>21,"sex"=>"female","email"=>"www@nnn.com"]
	];
	echo '<table border="1" width="800" align="center">';
	echo '<caption><h1>数组转成表格</h1></caption>';//h1??
	while(list($k,$row)=each($group)){
		echo '<tr>';
		if(is_array($row))
			while(list(,$col)=each($row))
			 echo '<td>'.$col.'</td>';
		else echo '<td colspan="4">'.$k.':'.$row.'</td>';
		echo '</tr>';
	}
	echo '</table>';

数组的内部指针控制函数遍历数组

数组指针的控制函数
由于数组是由多笔资料集合而成,所以当程序需要运算处理其中某个索引位置的资料内容时,会由数组之中内定的指针,指向目标资料,以提供程序作正确的读取。下面针对数组指针控制的相关函数,作简单的说明介绍:
next()、prev()、end()及 reset()
这四个函数可以控制目前数组中的指针位置。next()负责将指针向后移动,prev()负责将指针向前移动;end()会将指针指向数组中最后一个元素,而 reset()函数则会将目前指针无条件移至第一个索引位置。
语法格式:
mixed next(数组名称); mixed prev(数组名称);
mixed end(数组名称); mixed reset(数组名称);
        mixed key(数组名称); mixed current(数组名称);
<?php
	$str=array("马上就要","开始寒假集训了","本宝宝","好怕怕");
	echo 'first:'.key($str).'=>'.current($str).'<br>';
	echo 'first:'.key($str).'=>'.current($str).'<br>';//没变
	
	next($str);
	echo 'second:'.key($str).'=>'.current($str).'<br>';

	end($str);
	echo 'last:'.key($str).'=>'.current($str).'<br>';

	prev($str);
	echo 'last:'.key($str).'=>'.current($str).'<br>';

	reset($str);
	echo 'last:'.key($str).'=>'.current($str).'<br>';

输出:
first:0=>马上就要
first:0=>马上就要
second:1=>开始寒假集训了
last:3=>好怕怕
last:2=>本宝宝
last:0=>马上就要