数组的运用

2018-05-19T17:35:33

遍历数组:

  • 通过foreach遍历数组
  • 通过数组指针函数来遍历数组
  • 通过each()和list()来遍历数组

[title]通过foreach遍历数组[/title]

foreach

foreach分为两种情况

只要键值的情况

foreach($数组名称 as $val){

循环体

}

既然键值又要键名的情况

foreach($数组名称 as $key=>$val){

循环体

}

foreach的另外一种写法:

foreach($数组名称 as $val):

循环体

endforeach;

$arr = [0, 1, 2];
foreach ($arr as $val):
  echo $val, '<br />';
endforeach;
unset($val);//最后要取消掉引用
$arr = range('a','z');
print_r($arr);
//通过for循环来遍历数组
for($i = 0, $count = count($arr); $i < $count; $i++){
  echo $arr[$i], '<br />';
};
//遇到下面的情况用就不能用foreach了
//foreach不管索引还是关联的还是混合的都可以
$arr = [
  'admin' => 'chulai',
  'password' => '123456',
  'birthday' => '928'
];
print_r($arr);
foreach ($arr as $v) {
  echo $v, '<br />';
}
foreach ($arr as $k => $v) {
  echo $k,'--',$v,'<br />';
}

foreach遍历二维数组

//二维的索引+关联数组(模拟数据)
$arr = [
  ['id' => 1, 'username' => 'a'],
  ['id' => 2, 'username' => 'b'],
  ['id' => 3, 'username' => 'c']
];
foreach ($arr as $arr) {
  echo '编号:', $arr['id'], '<br />';
  echo '用户名', $arr['username'], '<br />';
}
//二维的索引+关联数组(模拟数据)
$arr = [
  ['id' => 1, 'username' => 'a'],
  ['id' => 2, 'username' => 'b'],
  ['id' => 3, 'username' => 'c']
];
foreach ($arr as $arr) {
  echo '编号:', $arr['id'], '<br />';
  echo '用户名', $arr['username'], '<br />';
}

foreach特殊形式解析

从PHP 5.6.x 移植到 PHP 7.0.x

1.foreach不再改变内部数组指针

在PHP7之前,当数组通过 foreach 迭代时,数组指针会移动。现在开始,不再如此

current函数

描述:current — 返回数组中的当前单元,每个数组中都有一个内部的指针指向它“当前的”单元,初始指向插入到数组中的第一个单元。

用法:mixed current ( array &$array )

//php5.6->7.0 foreach不再改变数组内部的指针
$arr = [0, 1, 2];
foreach ($arr as &$val) {
  var_dump(current($arr));
}

而Output of the above example in PHP 5:  0 1 2

2、foreach通过值遍历时,操作的值为数组的副本

当默认使用通过值遍历数组时,foreach 实际操作的是数组的迭代副本,而非数组本身。这就意味着,foreach 中的操作不会修改原数组的值。

// 在php7.0后的版本中foreach 通过值遍历时,操作的值为数组的副本
$arr = [0, 1, 2];
$ref = &$arr;
//老版本会跳过1
foreach($arr as $val){
  echo $val, '<br />';
  unset($arr[1]);
}
var_dump($arr, $ref);

3、foreach通过引用遍历时,有更好的迭代特性

当使用引用遍历数组时,现在 foreach 在迭代中能更好的跟踪变化。

// foreach通过引用遍历时,有更好的迭代特性
$arr = ['a'];
foreach($arr as &$val){
  echo $val, '<br />';
  $arr[1] = 'b';
}

Output of the above example in PHP 5: a

Output of the above example in PHP 7: a b

[title]通过数组指针来遍历数组[/title]

key($array):得到当前指针所在位置的键名,如果不存在,返回null
current($array):得到当前指针所在位置的键值,如果不存在,返回false
next($array):将当前数组指针向下移动一位,并且返回当前指针所在位置的键值;如果没有,返回false
pre($array):将当前数组指针向上移动一位,并且返回当前指针所在位置的键值;如果没有,返回false
reset($array):将当前数组指针移动到开始,并且返回当前指针所在位置的键值;如果没有,返回false
end($array):将当前数组指针移动到数组的末位,并且返回当前指针所在位置的键值;如果没有,返回false

$arr = [
  'a', 'b', 'c',
  35 => 'test',
  'username' => 'chunlai',
  'age' => 20
];
var_dump($arr);
echo '当前指针所在位置的键名为:', key($arr), '<br />';
echo '当前指针所在位置的键值为:', current($arr), '<br />';
echo next($arr), '<br />';
echo '当前指针所在位置的键名为:', key($arr), '<br />';
echo '当前指针所在位置的键值为:', current($arr), '<br />';

$arr = [
  'a', 'b', 'c',
  35 => 'test',
  'username' => 'chunlai',
  'age' => 20
];
while(!is_null(key($arr))){
  echo '当前指针所在位置的键名为:', key($arr), '<br />';
  echo '当前指针所在位置的键值为:', current($arr), '<br />';
  next($arr);
}

ps:不要用current($arr)作为循环判断的条件,因为有可能键值就是false,那么就结束循环了。

而用key($arr)的好处是,就算键名是null,它会自动转化成空字符串,所以不影响

Demo:取出数组开始和结束的时候的键值

$filename = '1.txt.php';
$res = explode('.', $filename);
print_r($res);
echo end($res), '<br />';
echo reset($res);

ps: explode函数 ,描述:explode — 使用一个字符串分割另一个字符串

[title]数组相关API[/title]

  • 创建数组操作
  • 键值相关操作
  • 数组指针相关操作
  • 数组拆分与合并相关操作
  • 数组交集与差集相关操作
  • 数组排序相关操作

小Demo:判断文件的后缀名是否符合要求

$allowExts = ['jpg', 'jpeg', 'gif', 'png'];
$filename = '1.txt.php.jpg';
$ref = explode('.',$filename);
$ext = end($ref);
var_dump(in_array($ext, $allowExts));

output:true

array_push();入栈
array_pop();出栈
array_unshift();在数组开始位置压入
array_shift();弹出数组开始部分

$arr = ['a', 'b', 'c'];
$res = array_pop($arr);
var_dump($arr);
array_push($arr, 'Hello world');
var_dump($arr);

快速生成字符串

$str1 = join(',',range(0,9));
var_dump($str1);

output: string '0,1,2,3,4,5,6,7,8,9'

合并数组

array_merge($arr1, $arr2, $arr3, ....);

当前页面是本站的「Baidu MIP」版。发表评论请点击:完整版 »
因本文不是用Markdown格式的编辑器书写的,转换的页面可能不符合MIP标准。