2015-06-07 3 views
2

Я использую инструмент mikealmond для анализа PHP API MusicBrainz (имеется документация here). Я сталкиваюсь с такой простой проблемой, что не могу понять, что я делаю неправильно. Я пытаюсь восстановить все записи для данного исполнителя (Дэвид Гетта для моих тестов).Предотвращение наличия нескольких раз в том же массиве в php

Вот код:

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!

+0

вместо 'in_array' я бы просто использовать' Исеть ($ arrayRecordings [$ запись [ «ID»]]) ', почему цикл по массиву, когда вы можете проверить точный пункт – slash197

+0

@ slash197: Тот же результат – Zl3n

+0

Что вы имеете в виду двойную информацию? Вы сбрасываете один и тот же массив дважды. В первом цикле запись, добавленная в массив и массив, отображается с 1 элементом. Во втором цикле добавляется еще одна запись, и в массиве теперь есть 2 (уникальных) элемента. См. Также ответ Жасни (жирная линия). – Barry

ответ

2

in_array ищет значение внутри массива. В этом случае значения связаны с массивами. Вы можете проверить, если ключ существует

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

В любом случае, выход не изменится, так как ваш цикл замены повторяющихся данных. Запись на один и тот же ключ в ошибке перезаписывает существующие данные. Таким образом, в массиве $arrayRecordings нет дубликатов.

Обратите внимание, что вы делаете var_dump внутри внешнего вида, заставляя вас видеть каждое состояние массива по мере его сборки. Вы можете рассчитывать только на конечный результат.

Если вы делаете var_dump вне цикла foreach, вы увидите, что $arrayRecordings не содержит дубликатов.

+0

Ом. Я не видел, что я положил свой «var_dump» внутри foreach. спасибо – Zl3n

Смежные вопросы