2009-05-11 6 views
0

Ich muss ein Array in PHP selektiv reduzieren, aber tun Sie es selektiv. Wenn ein Schlüssel mit einem Muster übereinstimmt, sollten alle Unterelemente unterhalb dieses Schlüssels in die Ausgabe "flach" aufgenommen werden.Ein PHP-Array selektiv nach Elternschlüsseln verflachen

SO Wenn ich einen Katalog von Musik hatte:

=> Array von Alben =>, von denen jeder eine Reihe von Songtitel

Dann könnte ich für eine Zeichenfolge suchen, und würde eine Wohnung bekommen Array in Antwort. Also, wenn ich nach 'Sonne' suchte, dann würde ich den gesamten Katalog für jeden Künstler mit 'Sonne' in ihrem Namen bekommen, plus die Alben für andere Künstler, wo 'Sonne' im Albumnamen war.

Hoffentlich macht das Sinn.

Wer hat irgendwelche Gedanken?

Antwort

1

Ok, ich werde Ihre Daten sieht wie folgt zu übernehmen:

$data = array(
    "Bill Withers" => array (
     "Lovely Day", 
     "Use Me", 
     "Ain't No Sunshine" 
    ), 
    "Fleet Foxes" => array (
     "Sun It Rises", 
     "White Winter Hymnal" 
    ), 
    "Billy Joel" => array (
     "Piano Man" 
    ) 
); 

... und dass die Eingabe gegeben "Bill", wollen Sie die Ausgabe: ["Lovely Day", "Use Me", "Ain't No Sunshine", "Piano Man"]. Hier ist eine Möglichkeit, wie Sie es tun können.

function getSongs($data, $searchTerm) { 
    $output = array(); 
    foreach ($data as $artist => $songs) { 
     if (stripos($artist, $searchTerm) !== false)) { 
      $output = array_merge($output, $songs); 
     } 
    } 
    return $output; 
} 

... Ich nehme auch an, dass Sie einen guten Grund haben, keine Datenbank dafür zu verwenden.

3

Gibt es einen Grund, warum Sie nicht eine Datenbank verwenden, um zu speichern, was wie eine erhebliche Menge an Informationen klingt? Es wäre ziemlich einfach, eine Abfrage in SQL zu schreiben, um die gewünschten Daten herauszuziehen.

+0

+1: Das war mein erster Gedanke, auch. – Powerlord

0

Meinst du sowas?

$a = array(
    "Sunny" => "Bla-bla1", 
    "Sun" => "Bla-bla2", 
    "Sunshine" => "Bla-bla3", 
); 

foreach ($a as $k => $v) 
{ 
// check here whenever you want for $k 
// apply something to $v 
if (...) 
     $b[$i++] = $v; 
} 
0
$sample_data = array( 
    'artist_name' => array( 
     'album_name' => array( 
      'song_name', 
      'other_mp3_id_info' 
      ) 
     ) 
    ); 

function s2($needle,$haystack) { 

    $threads = array(); 
    foreach ($haystack as $artist_name => $albums) { 
     if (stripos($artist_name, $needle) !== false)) { 
      $threads[] = $haystack[$artist_name]; //Add all artist's albums 
     } else { 
      foreach ($albums as $album_name => $songs) { 
       if (stripos($album_name, $needle) !== false)) { 
        $threads[$artist_name][] = $haystack[$album_name]; //add matching album 
       } 
      } 
     } 
    } 
    return $threads; 
} 
0

Um Nickf Arbeit, vorausgesetzt, Ihre Daten sieht aus wie seine bauen aus, würde ich die Funktion auf diese Weise schreiben.

function getSongs($data, $searchTerm) { 
    foreach ($data as $artist => $songs) { 
     if (stripos($artist, $searchTerm) !== false)) { 
      $output[$artist] = $songs; 
     } 
    } 
    return $output or null; 
} 

Die Ergebnisse dieser Funktion, wenn keine Spiele offensichtlich null zurück anstelle eines leeren Array gefunden wird; Wenn mehrere Übereinstimmungen gefunden werden, werden sie von ihrem Künstler gruppiert. Ich finde direkte Zuweisung, $output[$artist] = $songs, um vorhersagbarere Ergebnisse als array_merge in meiner eigenen Erfahrung zur Verfügung zu stellen. (Dies bewahrt auch den Künstler für die Ausgabe dieser Daten.)

Wie NickF sagte, würde ich annehmen, dass Sie einen guten Grund haben, dies nicht mit einer Datenbank zu tun? SQL für diese wäre sehr einfach, wie

SELECT artist, song FROM songs WHERE artist LIKE '%Bill%' GROUP BY artist; 
0

Sie preg_grep für die Suche verwenden können, müssen Sie den Eingang sanieren, aber:

$matchingArtists = preg_grep('/' . preg_quote($searchString) . '/', array_keys($data)); 
$matchingSongs = array(); 
foreach ($data as $artist => $songs) { 
    $matchingSongs = array_merge($matchingSongs, preg_grep('/' . preg_quote($searchString) . '/', $songs)); 
}