diff --git a/src/Composer/Command/SuggestsCommand.php b/src/Composer/Command/SuggestsCommand.php index 93aae86a0..35d5e01a3 100644 --- a/src/Composer/Command/SuggestsCommand.php +++ b/src/Composer/Command/SuggestsCommand.php @@ -57,7 +57,7 @@ EOT $filter = $input->getArgument('packages'); - // First assemble list of packages that are installed, replaced or provided + // First assemble lookup list of packages that are installed, replaced or provided $installed = array(); foreach($packages as $package) { $installed[] = $package['name']; @@ -70,19 +70,23 @@ EOT $installed = array_merge($installed, array_keys($package['replace'])); } } - sort($installed); - $installed = array_unique($installed); + + // Undub and sort the install list into a sorted lookup array + $installed = array_flip($installed); + ksort($installed); // Next gather all suggestions that are not in that list $suggesters = array(); $suggested = array(); foreach ($packages as $package) { - if ((empty($filter) || in_array($package['name'], $filter)) && !empty($package['suggest'])) { - foreach ($package['suggest'] as $suggestion => $reason) { - if (!in_array($suggestion, $installed)) { - $suggesters[$package['name']][$suggestion] = $reason; - $suggested[$suggestion][$package['name']] = $reason; - } + $packageName = $package['name']; + if ((!empty($filter) && !in_array($packageName, $filter)) || empty($package['suggest'])) { + continue; + } + foreach ($package['suggest'] as $suggestion => $reason) { + if (!isset($installed[$suggestion])) { + $suggesters[$packageName][$suggestion] = $reason; + $suggested[$suggestion][$packageName] = $reason; } } } @@ -103,7 +107,7 @@ EOT } // Simple mode - if ($mode == 0) { + if ($mode === 0) { foreach (array_keys($suggested) as $suggestion) { $io->write(sprintf('%s', $suggestion)); }