Cameeob2003
Cameeob2003

Reputation: 482

Array element not being assigned in foreach loop

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

Upvotes: 0

Views: 295

Answers (1)

Ja͢ck
Ja͢ck

Reputation: 173542

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

Upvotes: 3

Related Questions