2010-12-15 7 views
0

다차원 배열의 지정된 값에서 키를 가져옵니다. 그것은 키를 얻기 위해 사용하고있는 중첩 된 foreach 루프 외부에서 변수에 액세스 할 수없는 것 외에는 잘 작동합니다. 중첩 된 foreach 문에서 변수에 액세스 PHP

는 나의 foreach 루프는 다음과 같습니다

foreach($name_books as $test) { 
    foreach ($test as $key => $value) { 
    $book_code = array_search($row['name'],$test); 
    echo $book_code; //just to see if it works, which it does 
    break; 
     } 
    } 
//But then if I go outside of the loop.. 

echo $book_code." is the book code"; // <--DOES NOT WORK 

그래서 내가 여기에 변수 범위의 문제를 다루는거야 알고 ($ name_books 3 개 작은 배열을 포함하는 다중 차원 배열) 내가 시도했습니다 foreach 루프 안에 전역을 선언하지만 아무 것도 작동하지 않습니다.

내가 터무니없이 간단한 것이 있다는 것이 확실합니다. 편집

:

urg..I 다시 발을 내딛었습니다 뭔가 다른, 모든이의 (a DB에서 점점 물건) while 루프 내부에서 무슨 일이 일어나고을 실현은

그래서 코드는 더 같다 : 이를 포함하지 않는

while($row=mysql_fetch_assoc($result)) { 

    ...original foreach loop from above 

} 

사과, 나는이 작은 조각에 초점을 맞추고 백업과 맞는 곳을보고 깜빡했다.

답변

2

게시 한 내용이 스크립트에있는 것과 정확히 동일하면 변수 범위와 아무런 관련이 없습니다.

저는 문제가 무엇인지 생각합니다. 내부 루프에서 벗어났습니다. 외부 루프의 각 반복에서 $ book_code가 변경되므로 외부 루프도 중지해야합니다. break;break 2;으로 변경하고 문제가 해결되는지 확인하십시오. 이로 인해 내부 루프와 외부 루프가 모두 중단됩니다.

편집 : 코드를 단순화 할 수도 있습니다.

foreach ($name_books as $test) { 
    $book_code = array_search($row['name'], $test); 
    if ($book_code !== FALSE) { 
     break; 
    } 
}
구조에 대해 더 많이 알고 있다면 이것은 단일 SQL 문과 0 루프로 축소 될 수 있습니다.

+0

당신은 빠른 내가 먼저 당신의 대답을 얻었다보다 훨씬을 입력합니다. – labue

+0

이 덕분에, 나는 아무것도 사용하지 않았지만 기본 휴식 전에. 그러나 나는 전체 그림을 포함시키지 않았다는 것을 잊었다 !! (죄송합니다!) 위의 편집을 참조하십시오. – dijon

+0

그게 다야, 고마워! 나는 아직도이 일이 왜 일어 났는지 혼란 스럽다. 조금 더 공부하게 될 것이다. 하지만 도움에 너무 감사드립니다. – dijon

5
break; 

내부 중첩 된 foreach 만 종료합니다. $name_books에 더 많은 행이 있으면 계속 반복되며 결국 의 'false'값을 사용하여 $book_code을 덮어 씁니다. 당신은 당신이 찾고있는 가치를 발견하면

은 사용 : 당신이 휴식 귀하의 편집에 관한

break 2; 

당신이 발견했습니다 당신이 값으로하고있는에 따라 달라집니다 $book_code에 있습니다. 계속할 계획이 없다면 매개 변수를 break으로 변경하십시오. break 3;while 루프를 종료합니다. 중첩 수준에 따라 값을 변경하십시오.

+0

매개 변수가 허용 된 중단을 알지 못했습니다. 오늘 내가 뭔가 새로운 것을 배웠던 것처럼 보입니다. – Craige

+0

이것은 나에게도 뉴스입니다. 좋은 게시물. – Dutchie432

+0

우수, 휴식에 대한 정보 주셔서 감사합니다. – dijon

1

simshaun이 맞지만 실제로는 다른 접근 방식을 취할 것입니다.

휴식을 처리하기보다 foreach 루프에 $ book_code가 있는지 확인합니다.

새로운 코드

foreach($name_books as $test) { 
    foreach ($test as $key => $value) { 
     if(!isset($book_code)){ 
      $book_code = array_search($row['name'],$test); 
      echo $book_code; //just to see if it works, which it does 
     } 
    } 
} 

echo $book_code." is the book code"; 
+1

나는 동의하지 않는다. 두 루프에서 벗어나지 않으면 배열을 불필요하게 반복 처리해야합니다. 현실적으로 어레이가 매우 커지지 않으면 효율이 눈에 띄지 않을 것이며, 루프를 벗어나는 것은 훨씬 더 효율적입니다. – simshaun

+0

몇 가지 중요한 정보를 무시했습니다! 위의 편집을 참조하십시오. – dijon

관련 문제