2012-08-27 4 views
0

배열 요소에 할당 된 id 값을 가져 오려고합니다. 내가 겪고있는 문제는 foreach를 통해 70 개의 루프마다 하나의 id를 할당한다는 것입니다. 나는이 책에서 내가 뭘 잘못하고 있는지 확실히 모른다.배열 요소가 foreach 루프에 할당되지 않았습니다.

$search = 'echem'; 
$data = array(); 
$tags = null; 
$i = 0; 
//var_dump($this->videos); 
foreach ($this->videos as $key => $value) { 
    foreach ($value as $key => $value) { 
     if ($key === 'id') { 
      $data[$i]['id'] = (int)$value; 
     } 
     if ($key == 'tags') { 
      $tags = explode(',', $value); 
     } 
     //echo $key . ' - '; 
     if (is_array($tags)) { 
      foreach ($tags as $key => $value) { 
       if (strtoupper($value) == strtoupper($search)) { 
        //echo 'Search Found <br/>'; 
        $data[$i]['found'] = 1; 
       } 
       //echo $value.', '; 
      } 
      //echo '<br/>'; 
     } 
     if (!isset($data[$i]['found'])) { 
      $data[$i]['found'] = 0; 
     } 
     $data[$i]['subId'] = $i; 
     $i++; 
    } 
} 

당신은 메신저는 $ 키는 다음 코드에 맞춰 8 ID가 있는지 확인 볼 수 있습니다 :

if ($key === 'id') { 
    $data[$i]['id'] = (int)$value; 
} 
그때를 통해 실행 나타나는 루프의 나머지를 통해 실행

필요에 따라 모든 것을 할당하십시오. 키 ID는 모든 루프의 첫 번째 키이므로이를 할당하지 않으면 왜 저를 곤란하게 만듭니다. 어떤 도움이라도 대단히 감사합니다. 위해서 var_dump의

출력() :

array (size=58086) 
    0 => 
    array (size=3) 
     'id' => int 1 
     'found' => int 0 
     'subId' => int 0 
    1 => 
    array (size=2) 
     'found' => int 0 
     'subId' => int 1 
    2 => 
    array (size=2) 
     'found' => int 0 
     'subId' => int 2 
    3 => 
    array (size=2) 
     'found' => int 0 
     'subId' => int 3 
    4 => 
    array (size=2) 
     'found' => int 0 
     'subId' => int 4 
    5 => 
    array (size=2) 
     'found' => int 1 
     'subId' => int 5 
    6 => 
    array (size=2) 
     'found' => int 0 
     'subId' => int 6 
    7 => 
    array (size=2) 
     'found' => int 0 
     'subId' => int 7 
+0

'위해서 var_dump ($ 데이터)'은'foreach' 후에 무엇을 생산 하는가? – Matt

+1

이 컨텍스트에서는 문제가 발생하지 않지만 중첩 된'foreach' 루프에서는'$ value'를 덮어 쓰면 안됩니다. – Matt

+4

세 개의 foreach 루프 모두'$ key => $ value'를 사용합니다 - 따라하기 다소 혼란 스럽습니다. 코드를 쉽게 유지 관리하려면 다른 이름을 지정해야합니다. – andrewsi

답변

3

나는 약간 지루했다, 그래서 나는 코드를 재 작성 : 나는 as $key => $value 더 합리적인 이름을 개명 한

  1. 합니다.

  2. 간단한 배열 참조와 isset()으로 충분하므로 중간 foreach 루프를 제거했습니다.

  3. 루프가 시작되기 전에 strtoupper() ~ $search을 적용합니다 (여러 번 반복하지 않아도 됨).

결과 :

$search = 'echem'; 
$data = array(); 

$i = 0; 
$search = strtoupper($search); 

foreach ($this->videos as $video) { 
    if (!isset($video['id'], $video['tags'])) { 
     continue; // skip records you can't use 
    } 
    // populate the `$data` entry 
    $data[$i]['id'] = $video['id']; 
    $data[$i]['tags'] = explode(',', $video['tags']); 

    // find a match in the tags 
    $data[$i]['found'] = 0; 
    foreach ($data[$i]['tags'] as $tag) { 
     if (strtoupper($tag) == $search) { 
      $data[$i]['found'] = 1; 
     } 
    } 
    $data[$i]['subId'] = $i; 
    $i++; 
} 
+0

루프가 시작되기 전에'$ i = 0;'을 잊어 버렸습니다 :) – Mahn

+0

@Mahn that was not all : 업데이트 됨 –

관련 문제