Порядок и сортировка массива и ключа - PullRequest
0 голосов
/ 08 мая 2020

пытался найти, но не могу найти то, что ищу.

У меня есть этот массив:

$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 = array(
    array('bono' => 'I still havent'),
    array('edge' => 'found what'),
    array('bono' => 'I am looking for')
);

Я просто получаю:

bono => I still haven't I am looking for
edge => found what

Спасибо за ваше время

Ответы [ 2 ]

2 голосов
/ 08 мая 2020

Это просто отслеживает, где было сохранено последнее слово (относительно человека), и проверяет, изменилось ли оно, если оно было, затем перейти к следующей записи ...

$output = [];
$last = -1;
foreach ( $u2 as $word )    {
    $who = key($word);
    // If first time or the current who doesn't match the last one
    if ( $last == -1 || key($output[$last]) != $who )   {
        $last++;
        // Make sure new entry exists
        $output [$last][$who] = '';
    }
    // Add in the new word
    $output [$last][$who] .= ' '.current($word);
}
2 голосов
/ 08 мая 2020

Это в основном приложение для реализации 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);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...