Чтобы построить работу NickF, предполагая, что ваши данные выглядят как его, я бы написал эту функцию следующим образом.
function getSongs($data, $searchTerm) {
foreach ($data as $artist => $songs) {
if (stripos($artist, $searchTerm) !== false)) {
$output[$artist] = $songs;
}
}
return $output or null;
}
Результаты этой функции, когда совпадения не найдены, будут, очевидно, возвращать ноль вместо пустого массива; когда найдено несколько совпадений, они будут сгруппированы по исполнителю. По моему собственному опыту, прямое назначение $output[$artist] = $songs
дает более предсказуемые результаты, чем array_merge. (Это также сохраняет художника для вывода этих данных.)
Как сказал НикФ, я полагаю, у вас есть веская причина не делать этого с базой данных? SQL для этого будет очень простым, например,
SELECT artist, song FROM songs WHERE artist LIKE '%Bill%' GROUP BY artist;