0

I am trying to get an a value of id assigned to an array element. The problem I am having is that it will assign one id every 70 loops through the foreach. I am not quite sure what I am doing wrong on this one.

$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++;
    }
}

as you can see im checking to see if the $key is id on line 8 with the following code:

if ($key === 'id') {
     $data[$i]['id'] = (int)$value;
}

I then run through the rest of the loop which appears to run through just fine and assign everything as needed. The key id is the first key in every loop through so why its not assigning it has me stumped. Any help is much appreciated.

output of 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
7
  • what does var_dump($data) produce after the foreach? Commented Aug 27, 2012 at 18:47
  • 1
    It won't cause an issue in this context, but you shouldn't overwrite $value in the nested foreach loops. Commented Aug 27, 2012 at 18:48
  • 4
    All three of your foreach loops both use $key => $value - that's a little confusing to follow. You should give them different names, to make maintaining your code easier. Commented Aug 27, 2012 at 18:48
  • 1
    @andrewsi: and that's the whole bug too - the inner loops are overwriting the $key values for the outer loops. Commented Aug 27, 2012 at 18:53
  • 3
    foreach ($value as $key => $value) { is a recipe for disaster. Commented Aug 27, 2012 at 18:54

1 Answer 1

3

I was a bit bored, so I rewrote your code:

  1. I've renamed the as $key => $value to more sensible names.

  2. I've removed the middle foreach loop, because a simple array reference and isset() suffices.

  3. Applying strtoupper() to $search before the loop starts (avoids having to do this multiple times).

Result:

$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++;
}
Sign up to request clarification or add additional context in comments.

1 Comment

You forgot $i = 0; before the loop starts :)

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.