Это в основном приложение для реализации control break . Вы сравниваете значение текущего l oop элемента со значением предыдущего, и в зависимости от того, совпадают они или нет, вы реагируете соответствующим образом.
Отказ от ответственности: если вам действительно нравится U2 , тогда вы можете, конечно, захотеть заменить имена переменных: -)
Я использую здесь вспомогательный массив $ temp для сбора «фрагментов lyri c» текущего поющего «douchebag» , и как только douchebag изменяется, они добавляются в массив результатов, а вспомогательный массив снова очищается.
И если вспомогательный массив все еще содержит фрагменты после l oop, их также необходимо добавить затем на дополнительном шаге. (Что касается последней записи, то не будет ни одного следующего придурка, с которым можно было бы сравнивать больше. С этим можно было бы справиться по-другому, с «взглядом вперед», а не «взглядом назад» - но это усложнило бы l oop logi c немного.)
Из-за вашей структуры входного массива требуется array_keys
, чтобы получить ключ подмассива. (На самом деле для этого потребуется только array_key_first
, но он доступен только с PHP 7.3.0, поэтому здесь я использовал более совместимую альтернативу.)
$u2 = array(
array('bono' => 'I'),
array('bono' => 'still'),
array('bono' => 'havent'),
array('edge' => 'found'),
array('edge' => 'what'),
array('bono' => 'I'),
array('bono' => 'am'),
array('bono' => 'looking'),
array('bono' => 'for'),
);
$thatTimeU2gaveFreeMusicAway = [];
$previous_douchebag = false;
$temp = [];
foreach( $u2 as $terrible_lyric ) {
$current_douchebag = array_keys($terrible_lyric)[0];
if( $previous_douchebag && $previous_douchebag != $current_douchebag ) {
$thatTimeU2gaveFreeMusicAway[] = [$previous_douchebag => implode(' ', $temp)];
$temp = [];
}
$temp[] = $terrible_lyric[$current_douchebag];
$previous_douchebag = $current_douchebag;
}
if( count( $temp ) ) {
$thatTimeU2gaveFreeMusicAway[] = [$previous_douchebag => implode(' ', $temp)];
}
var_dump($thatTimeU2gaveFreeMusicAway);