foreach遍历数组详解,for循环遍历数组

http://www.itjxue.com  2023-01-20 04:58  来源:未知  点击次数: 

PHP中的函数-- foreach()的用法详解

PHP

4

引入了

foreach

结构,和

Perl

以及其他语言很像。这只是一种遍历数组简便方法。foreach

仅能用于数组,当试图将其用于其它数据类型或者一个未初始化的变量时会产生错误。有两种语法,第二种比较次要但却是第一种的有用的扩展。

复制代码

代码如下:

foreach

(array_expression

as

$value)

statement

foreach

(array_expression

as

$key

=

$value)

statement

第一种格式遍历给定的

array_expression

数组。每次循环中,当前单元的值被赋给

$value

并且数组内部的指针向前移一步(因此下一次循环中将会得到下一个单元)。

第二种格式做同样的事,只除了当前单元的键名也会在每次循环中被赋给变量

$key。

自PHP

5

起,还可能遍历对象。

注意:当

foreach

开始执行时,数组内部的指针会自动指向第一个单元。这意味着不需要在

foreach

循环之前调用

reset()。

注意:除非数组是被引用,foreach

所操作的是指定数组的一个拷贝,而不是该数组本身。foreach对数组指针有些副作用。除非对其重置,在

foreach

循环中或循环后都不要依赖数组指针的值。

PHP

5

起,可以很容易地通过在

$value

之前加上

来修改数组的元素。此方法将以引用赋值而不是拷贝一个值。

复制代码

代码如下:

?php

$arr

=

array(1,

2,

3,

4);

foreach

($arr

as

$value)

{

$value

=

$value

*

2;

}

//

$arr

is

now

array(2,

4,

6,

8)

?

此方法仅在被遍历的数组可以被引用时才可用(例如是个变量)。

复制代码

代码如下:

?php

foreach

(array(1,

2,

3,

4)

as

$value)

{

$value

=

$value

*

2;

}

?

foreach数组看不懂,请高手帮解释一下

首先你的foreach参数写错了, $array应该为开始定义的二维数组$a.

我先说说foreach,它用于遍历数组,其后两种写法:

1,($a as $value) ,意为遍历数组$a,当前调用其元素值为$value.

2,($a as $key=$value),意为遍历数组$a,当前调用其元素键名为$key,值为$value.

这个过程是先创建一个空数组$new_array,用于存储所需值.foreach这个刚才讲了,这里不说了.

主要是foreach内部的判断句.isset($new_array[$_value['id']]),是说以当前调用$a元素(也为数组)的id元素值 为键的$new_array的元素是否存在.如果存在,比对,取大值,如果不存在,创建$new_array的元素保存.

有点罗嗦,说白了就是 先从$a中取一个元素.将这个元素的id值作为其键,看看在$new_array中是否已经有了这个元素.如果有,就取date的最大值替换.如果没有,就将之保存在$new_array,等待以后遍历时比对.

这个过程$new_array中不会保存重复的id值.因为一旦重复,就被替换.

现在就看看执行过程,第一次遍历,取array('id' = 1, 'date' = '2008-08-09'),在foreach内部,判断$new_array[1]是否存在,肯定不存在(现在还为空呢),所以,保存为$new_array[1]=array('id' = 1, 'date' = '2008-08-09').

第二次遍历,取array('id' = 2, 'date' = '2008-08-09'),肯定$new_array[2]也不存在,于是$new_array[2]=array('id' = 2, 'date' = '2008-08-09')

同理,第三次遍历也不存在,$new_array[3]=array('id' = 3, 'date' = '2008-08-09')

第四次遍历,因为取到array('id' = 1, 'date' = '2008-08-10'),id=1,所以$new_array[1]存在,但是其date大于$new_array[1]的date,所以,取最大值,$new_array[1]=array('id' = 1, 'date' = '2008-08-10')

同样,第五次遍历$new_array[2]=array('id' = 2, 'date' = '2008-08-10').

这样,

$new_array[1]=array('id' = 1, 'date' = '2008-08-10')

$new_array[2]=array('id' = 2, 'date' = '2008-08-10')

$new_array[3]=array('id' = 3, 'date' = '2008-08-9')

最后函数array_values是返回数组中所有值,并重新建立数字索引,因为$new_array[0]没有,所以原始的键值均减1.

$new_array[0]=array('id' = 1, 'date' = '2008-08-10')

$new_array[1]=array('id' = 2, 'date' = '2008-08-10')

$new_array[2]=array('id' = 3, 'date' = '2008-08-09')

数组与对象的遍历

?? forEach(): 对数组进行遍历循环,对数组中的每一项运行给定函数。这个方法没有返回值。参数都是function类型,默认有传参,参数分别为:遍历的数组内容;第对应的数组索引,数组本身。

?? map(): 指“映射”,对数组中的每一项运行给定函数,返回每次函数调用的结果组成的数组。

?? filter(): “过滤”功能,数组中的每一项运行给定函数,返回满足过滤条件组成的数组。

?? every() : 判断数组中每一项都是否满足条件,只有所有项都满足条件,才会返回true。

?? some() : 判断数组中是否存在满足条件的项,只要有一项满足条件,就会返回true。

?? reduce()和 reduceRight() : 这两个方法都会实现迭代数组的所有项,然后构建一个最终返回的值。reduce()方法从数组的第一项开始,逐个遍历到最后。而 reduceRight()则从数组的最后一项开始,向前遍历到第一项。

这两个方法都接收两个参数:一个在每一项上调用的函数和(可选的)作为归并基础的初始值。

?? keys + forEach 之流 返回一个数组,包括对象自身的(不含继承的)所有可枚举属性(不含Symbol属性)

?? for in 循环遍历对象自身的和继承的可枚举属性(不含Symbol属性)

?? Object.getOwnPropertyNames() 返回一个数组,包含对象自身的所有属性(不含Symbol属性,但是包括不可枚举属性).

?? Reflect.ownKeys(obj) 返回一个数组,包含对象自身的所有属性,不管属性名是Symbol或字符串,也不管是否可枚举.

注:

JS数组reduce()方法详解及高级技巧

ES6之Reflect

跪求详解~java中foreach方法来遍历数组的详解,主要问题是for(a:b)这里的问题不太懂!!!

增强for(part1:part2){part3};?

part2中是一个数组对象,或者是带有泛性的集合.?

part1定义了一个局部变量,这个局部变量的类型与part2中的对象元素的类型是一致的.?

part3当然还是循环体.

foreach语句是java5的新特征之一,在遍历数组、集合方面,foreach为开发人员提供了极大的方便。

foreach语句是for语句的特殊简化版本,但是foreach语句并不能完全取代for语句,然而,任何的foreach语句都可以改写为for语句版本。

foreach并不是一个关键字,习惯上将这种特殊的for语句格式称之为“foreach”语句。从英文字面意思理解foreach也就是“for 每一个”的意思。实际上也就是这个意思。

foreach的语句格式:

for(元素类型t 元素变量x : 遍历对象obj){

引用了x的java语句;

}

import?java.util.Arrays;?

import?java.util.List;?

import?java.util.ArrayList;?

/**

*?webkfa技术提供

*/

public?class?TestArray?{?

public?static?void?main(String?args[])?{?

TestArray?test?=?new?TestArray();?

test.test1();?

test.listToArray();?

test.testArray3();?

}?

/**?

*?foreach语句输出一维数组?

*/?

public?void?test1()?{?

//定义并初始化一个数组?

int?arr[]?=?{2,?3,?1};?

System.out.println("----1----排序前的一维数组");?

for?(int?x?:?arr)?{?

System.out.println(x);?//逐个输出数组元素的值?

}?

//对数组排序?

Arrays.sort(arr);?

//利用java新特性for?each循环输出数组?

System.out.println("----1----排序后的一维数组");?

for?(int?x?:?arr)?{?

System.out.println(x);?//逐个输出数组元素的值?

}?

}?

/**?

*?集合转换为一维数组?

*/?

public?void?listToArray()?{?

//创建List并添加元素?

ListString?list?=?new?ArrayListString();?

list.add("1");?

list.add("3");?

list.add("4");?

//利用froeach语句输出集合元素?

System.out.println("----2----froeach语句输出集合元素");?

for?(String?x?:?list)?{?

System.out.println(x);?

}?

//将ArrayList转换为数组?

Object?s[]?=?list.toArray();?

//利用froeach语句输出集合元素?

System.out.println("----2----froeach语句输出集合转换而来的数组元素");?

for?(Object?x?:?s)?{?

System.out.println(x.toString());?//逐个输出数组元素的值?

}?

}?

/**?

*?foreach输出二维数组测试?

*/?

public?void?testArray2()?{?

int?arr2[][]?=?{{4,?3},?{1,?2}};?

System.out.println("----3----foreach输出二维数组测试");?

for?(int?x[]?:?arr2)?{?

for?(int?e?:?x)?{?

System.out.println(e);?//逐个输出数组元素的值?

}?

}?

}?

/**?

*?foreach输出三维数组?

*/?

public?void?testArray3()?{?

int?arr[][][]?=?{?

{{1,?2},?{3,?4}},?

{{5,?6},?{7,?8}}?

};?

System.out.println("----4----foreach输出三维数组测试");?

for?(int[][]?a2?:?arr)?{?

for?(int[]?a1?:?a2)?{?

for?(int?x?:?a1)?{?

System.out.println(x);?

}?

}?

}?

}?

}

(责任编辑:IT教学网)

更多

推荐管理维护文章