防止在php中多次使用相同的数组

时间:2015-06-07 08:31:48

标签: php

我使用mikealmond工具来解析MusicBrainz的PHP API(文档可用here)。我面对这样一个简单的问题,我无法理解我做错了什么。我尝试恢复给定艺术家的所有录音(由David Guetta为我的测试)。

以下是代码:

public function getRecordingsWithArtistMbdi() {
    $arrayRecordings = array();
    $includes = array('artist-credits', 'tags');
    try {
        $recordings = $this->mb->browseRecording('artist', '302bd7b9-d012-4360-897a-93b00c855680', $includes);
        $countRecordings = $recordings['recording-count'];
        foreach ($recordings['recordings'] as $recording) {
            if (!in_array($recording['id'], $arrayRecordings)) {
                $record = array(
                    'titre' => isset($recording['title']) ? $recording['title'] : null,
                    'duree' => isset($recording['length']) ? $recording['length'] : null,
                    'tags' => isset($recording['tags']) ? $recording['tags'] : null,
                    'artist-credit' => isset($recording['artist-credit']) ? $recording['artist-credit'] : null
                );
                $arrayRecordings[$recording['id']] = $record;
            }
            var_dump($arrayRecordings);
        }
    } catch (Exception $e) {
        print $e->getMessage();
    }
}

这是我var_dump

的结果
array (size=1)
  '11329ba1-2645-4bbb-92ae-b2929188d51c' => // Ok, it is saved now
    array (size=4)
      'titre' => string 'ACDC' (length=4)
      'duree' => int 241786
      'tags' => 
        array (size=1)
          0 => 
            array (size=2)
              ...
      'artist-credit' => 
        array (size=1)
          0 => 
            array (size=3)
              ...
array (size=2)
  '11329ba1-2645-4bbb-92ae-b2929188d51c' => // Double information
    array (size=4)
      'titre' => string 'ACDC' (length=4)
      'duree' => int 241786
      'tags' => 
        array (size=1)
          0 => 
            array (size=2)
              ...
      'artist-credit' => 
        array (size=1)
          0 => 
            array (size=3)
              ...
  '124c53b9-6cc5-4f46-a811-598e8f2947fb' => 
    array (size=4)
      'titre' => string 'Baby When the Light' (length=19)
      'duree' => null
      'tags' => 
        array (size=0)
          empty
      'artist-credit' => 
        array (size=1)
          0 => 
            array (size=3)
              ...

如您所见,第一个数组已被记录,但尽管 if (!in_array($recording['id'], $arrayRecordings)) { ,每次都会学习。如何使用我当前的代码解决这个问题?

这是纯粹的php问题,问题不在于API的解析!

1 个答案:

答案 0 :(得分:2)

in_array在数组中查找值。在这种情况下,值是关联的数组。您可能想要检查密钥是否存在

if (!isset($arrayRecordings[$recording['id']]))

无论如何,由于您的循环正在替换重复数据,因此输出不会发生太大变化。在错误中写入相同的键会覆盖现有数据。因此$arrayRecordings数组中没有重复项。

请注意,您在外观中执行var_dump,导致您在构建时看到阵列的每个状态。您可能只期望最终结果。

如果您在var_dump循环之外执行foreach,则会发现$arrayRecordings不包含任何重复项。