2014-07-22 2 views
1

Я хотел бы знать, как добавить сравнения в foreach и перейти к следующему элементу. Я хочу, чтобы этот цикл, чтобы перейти к следующим данным, если фактические данные тестировании уже добавлены до или если его пустоготест foreach, если он еще не добавлен

foreach ($tracks as $i => $track) { 
    $id[$i]=$track['id']; 
    $title[$i]=$track['title']; 
    $genre[$i]=$track['genre']; 
    $artwork[$i]=$track['artwork_url']; 
} 

Я думал об этом, но он не работает.

foreach ($tracks as $i => $track) { 
    if (array_key_exists($track['id'],$id)){ 
     continue; 
    } 
    if (empty($track['artwork_url'])){ 
     continue; 
    } 
    $id[$i]=$track['id']; 
    $title[$i]=$track['title']; 
    $genre[$i]=$track['genre']; 
    $artwork[$i]=$track['artwork_url']; 
} 

Заранее спасибо за дружескую помощь :)

+0

Что такое '$ tracks', то, что является более широкий контекст здесь, что вы пытаетесь достичь? – Dan

+0

Что не работает над кодом? Также что такое '$ id'? –

+0

* sidenote * Неплохая идея разделить ваши данные на отдельные переменные. –

ответ

1

Ваш массив $id хранит значения на основе индекса, а не идентификатора; это должно работать, хотя:

if (in_array($track['id'], $id)) { 
    continue; 
} 

Это не очень эффективно, хотя для относительно небольших наборов данных в O (п) ищет все равно должно быть управляемым.

В качестве альтернативы, рассмотреть что-то вроде этого:

$result = []; 

foreach ($tracks as $track) { 
    if (isset($result[$track['id']]) || empty($track['artwork_url'])) { 
     continue; 
    } 

    $result[$track['id']] = array(
     'id' => $track['id'], 
     'title' => $track['title'], 
     'genre' => $track['genre'], 
     'artwork' => $track['artwork_url'], 
    ); 
} 
+0

С помощью этого решения вы должны убедиться, что '$ track ['id']' уникален. – Sarke

+0

@Sarke И не это то, что OP пытается сделать с этими 'continue;' заявлениями? –

+0

Обычно я избегаю 'in_array', если мне это не нужно, и в этом случае мы ищем ключ, а не значение. Однако с одним присваиванием во втором блоке кода ему не нужна проверка, потому что он просто перезапишет его, если это тот же идентификатор. Вот как я это сделаю. – Sarke

1

Ваша проблема, как представляется,

if (array_key_exists($track['id'],$id))

, потому что вы передаете это значение вместо ключа. Ключ $i, поэтому вторая строка должна быть

if (array_key_exists($i,$id)){

На стороне записки, я обычно использую

if (isset($id[$i])) или if (!empty($id[$i]))

, потому что я считаю его более читаемым.

+0

'isset' и'! Empty' - это не одно и то же. Я думаю, что вы ответили правильно, но просто [RTM] (http://php.net/manual/en/function.array-key-exists.php). –

+0

Я думаю, что вы совершенно правы, но я попытался с вашим решением, и он по-прежнему не фильтрует:/ – gmolveau

+0

@DaveChen, да, вот почему я сказал «или» в зависимости от того, что мне нужно для этого. – Sarke

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