foreach 색인을 찾는 방법은 무엇입니까?


490

foreach색인 을 찾을 수 있습니까?

A의 for루프는 다음과 같이 :

for ($i = 0; $i < 10; ++$i) {
   echo $i . ' ';
}

$i 당신에게 색인을 줄 것입니다.

for루프 를 사용해야 foreach합니까, 아니면 루프 에서 인덱스를 가져 오는 방법이 있습니까?

답변:


909
foreach($array as $key=>$value) {
    // do stuff
}

$key$array요소 의 색인입니다


2
OP가 인덱스가 의미하는 바에 따라 다릅니다. <? $ a = 배열 ​​(3,5, 'xx', 4312, 'sasas'); 미 설정 ($ a [3]); foreach ($ a as $ k => $ v) print "\ $ k = $ k and \ $ v = $ v"; ?>
Milen A. Radev

9
분명히,이 질문은 매우 구체적이지 않습니다. OP가 $ key => $ value 구문을 거의 인식하지 못했음을 의미했습니다.
Owen

38
글쎄 이것은 실제로 옳지 만 key도 문자열 일 수 있기 때문에 허용되는 대답이 아니어야합니다. $myarr['foo'] = 'bar';이 방법이 실패 한다고 말합니다
Toskan

12
@Bison 당신은 그것이 실패하지 않는다는 의미에서 옳습니다. 그러나 OP 질문을 준수하지 않습니다. 그는 n 번째 요소와 같은 숫자 값을 찾고 있습니다.
Toskan

3
@Toskan이 말했듯이 이것은 받아 들일만한 대답이되어서는 안됩니다. 루프 외부에서 변수를 만들고 거기에서 계산하여 vatiable++;반복 할 때 마다 증가시키는 것이 좋습니다. 전통적인 방식이지만 항상 효과가 있습니다.
Jomar Sevillejo

172

foreach각 런스 루에서 증분 된 필드와 같이을 해킹에 넣을 수 있습니다 . 이는 for루프가 숫자로 배열 된 배열에서 정확히 제공하는 것입니다. 이러한 필드는 수동 관리 (증가 등)가 필요한 의사 색인입니다.

A foreach$key가치 의 형태로 색인을 제공 하므로 그러한 해킹이 필요하지 않습니다.

예를 들어 foreach

$index = 0;
foreach($data as $key=>$val) {
    // Use $key as an index, or...

    // ... manage the index this way..
    echo "Index is $index\n";
    $index++;
}

127
루프에서 값이 증가하는 것은 '해킹'이 아닙니다.
Thomas McCabe

17
@ThomasMcCabe 루프의 핵심 용도 중 하나라고 말할 수도 있습니다.
Byson

26

key()모든 배열을 호출 하여 현재 키를 찾을 수 있습니다. 짐작할 수 있듯이 current()현재 값을 반환 next()하고 배열의 포인터를 다음 요소로 이동합니다.


Iterable 인터페이스 (루프의 위치를 ​​추적해야하는 위치)를 통해 노출 될 데이터를 저장하기 위해 일반 오래된 PHP 연관 배열을 사용하려는 경우 유용합니다.
피터

2
대안은 +1이지만 모든 반복에서 함수 호출은 미리 할당 된 변수 (예 : $keyfrom $key=>$value)를 사용하는 것보다 약간 무겁습니다 . 그러나 낮은 루프 성능은 중요하지 않습니다 / 간단한 루프에서는 허용됩니다.
Armfoot

20

오웬은 정답이 있습니다. 키만 원하고 배열로 작업하는 경우에도 유용 할 수 있습니다.

foreach(array_keys($array) as $key) {
//  do stuff
}

4
색인이 필요한 경우 foreach(array_keys($array) as $index=>$key).
Leo

14

$i루프 외부에서 만들고 루프 $i++의 맨 아래에서 수행 할 수 있습니다 .


16
이 방법은 반복 배열의 현재 색인이 아니라 루프의 현재 반복을 제공한다는 점에 유의해야합니다.
피터 베일리

8

이 두 개의 루프는 동일합니다 (물론 안전 난간을 막음) :

for ($i=0; $i<count($things); $i++) { ... }

foreach ($things as $i=>$thing) { ... }

예 :

for ($i=0; $i<count($things); $i++) {
    echo "Thing ".$i." is ".$things[$i];
}

foreach ($things as $i=>$thing) {
    echo "Thing ".$i." is ".$thing;
}

17
그것이 연관 배열이라면 아닙니다
JoeCortopassi


5

조나단이 맞습니다. PHP 배열은 키를 값에 매핑하는 맵 테이블 역할을합니다. 경우에 따라 배열이 정의되어 있으면 색인을 얻을 수 있습니다.

$var = array(2,5);

for ($i = 0; $i < count($var); $i++) {
    echo $var[$i]."\n";
}

당신의 출력은

2
5

이 경우 배열의 각 요소에는 알 수있는 색인이 있지만 다음과 같은 작업을 수행하면

$var = array_push($var,10);

for ($i = 0; $i < count($var); $i++) {
    echo $var[$i]."\n";
}

출력이 없습니다. 이것은 PHP의 배열이 대부분의 언어에서와 같이 선형 구조가 아니기 때문에 발생합니다. 그것들은 저장된 모든 값에 대한 키가 있거나 없을 수있는 해시 테이블과 비슷합니다. 따라서 foreach는 인덱스가 배열을 정의한 경우에만 인덱스를 가지고 있기 때문에 인덱스를 사용하여 크롤링하지 않습니다. 인덱스가 필요한 경우 배열을 크롤링하기 전에 배열이 완전히 정의되어 있는지 확인하고 for 루프를 사용하십시오.


그렇기 때문에 PHP 에서는 인덱스가 아닌 키로 "배열에 참여"해야합니다. array_map (func, $ a, $ b) 도 참조하십시오 .
피터 크라우스

독자 여러분, 독자 여러분과 @TheBrawnyMan 여러분의 예제는 array_push () 버그 (!)와 같습니다. 권장 사항은 사용하는 $var[] = 10;것이므로 (PHP 링크 참조) 두 번째 for루프는 예상 결과를 출력합니다.
피터 크라우스

4

PHP 배열에는 내부 포인터가 있으므로 다음을 시도하십시오.

foreach($array as $key => $value){
   $index = current($array);
}

나를 위해 잘 작동합니다 (단지 예비 테스트 만).


1

나는 일반적으로 연관 배열로 작업 할 때 이것을 수행합니다.

foreach ($assoc_array as $key => $value) {
 //do something
}

이것은 비 연관 배열에서도 잘 작동합니다. $ key가 색인 값이됩니다. 원하는 경우 다음을 수행 할 수도 있습니다.

foreach ($array as $indx => $value) {
  //do something
}

4
'대체'는 무엇입니까? 변수 이름 외에 이것이 동일하다는 것을 알고 있습니까? 따라서 마지막 문장과 코드 블록은 불필요합니다. 혼란
스러워하는

@ Dennis98 차이점은 그중 하나가 입력으로 연관 배열을 가지고 있고 다른 하나는 숫자 배열을 가지고 있다는 것입니다. 대답이 좀 더 장황하면 더 좋을 것 같습니다.
I_ATE_YOUR_WORK_FILES

0

이것을 추가하고 싶습니다. 라 라벨에서 이것을 사용하여 테이블을 색인화했습니다.

  • $ loop-> index로
  • 또한 1에서 시작하기 위해 ++ $ loop로 미리 증가시킵니다.

내 코드 :

@foreach($resultsPerCountry->first()->studies as $result)
  <tr>
    <td>{{ ++$loop->index}}</td>                                    
  </tr>
@endforeach

이 질문은 laravel에 대해서는 요청되지 않았습니다. $loop가 일반 PHP를 요구하기 때문에 변수는 사용할 수 없습니다.
Özgür Can Karagöz

0

같은 맥락에서 foreach 인덱스와 값을 사용해야 할 때이 방법을 해결했습니다.

$array = array('a', 'b', 'c');
foreach ($array as $letter=>$index) {

  echo $letter; //Here $letter content is the actual index
  echo $array[$letter]; // echoes the array value

}//foreach

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.