未在foreach循环中分配数组元素

时间:2012-08-27 18:46:12

标签: php arrays

我正在尝试获取分配给数组元素的id值。我遇到的问题是它将通过foreach每70个循环分配一个id。我不太确定我在这个问题上做错了什么。

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

你可以看到我正在使用以下代码检查$ key是否在第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

1 个答案:

答案 0 :(得分:3)

我有点无聊,所以我重写了你的代码:

  1. 我已将as $key => $value重命名为更明智的名字。

  2. 我删除了中间foreach循环,因为简单的数组引用和isset()就足够了。

  3. 在循环开始之前将strtoupper()应用于$search(避免多次执行此操作)。

  4. 结果:

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