Seçici ebeveyn tuşlara göre bir PHP dizi düzleşme

5 Cevap php

Ben seçici PHP bir dizi düzleştirmek gerekiyor, ama seçici bunu. Önemli bir desenle eşleşen sonra o tuşun altında tüm alt öğeleri 'düz' çıkışı dahil edilmelidir.

SO Ben müziğin bir katalog olsaydı:

=> Albümlerin dizi => Şarkı başlıkları bir dizi, her biri

Sonra bir dize için arama yapabilir ve Yanıtı düz bir dizi olacaktı. Ben 'güneş' için arama eğer SO sonra ben 'güneş' albüm adı oldu diğer sanatçılar için kendi adına 'güneş', artı albümleri ile herhangi bir sanatçı için tüm katalog almak istiyorum.

Umarım mantıklı.

Herkes herhangi bir düşünce var mı?

5 Cevap

Tamam, ben senin verileri bu gibi görünüyor kabul edeceğim:

$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"
    )
);

... Ve bu giriş "Bill", çıktıyı istediğiniz verilen: ["Lovely Day", "Use Me", "Ain't No Sunshine", "Piano Man"]. İşte bunu verebilecek bir yolu.

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

... Ben de bunun için bir veritabanı kullanmak için iyi bir nedeniniz var sanacaklar.

Eğer bilgi önemli bir miktar gibi sesler ne saklamak için bir veritabanı kullanarak değil bir sebebi var mı? İstediğin verileri çekmek için SQL bir sorgu yazmak için oldukça basit olacaktır.

Eğer böyle bir şey demek istiyorsun?

$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;
}

Veri onun benziyor varsayarak, NickF çalışmalarını kapalı inşa etmek, ben işlevini bu şekilde yazmak istiyorum.

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

Hiçbir sonuç bulunamadı bu işlev, sonuçları açıkça yerine boş bir dizi boş dönecektir; Birkaç sonuç bulunamadı zaman onlar daha sonra sanatçı tarafından gruplandırılmış olacak. Ben doğrudan atama, $output[$artist] = $songs, benim kendi deneyim array_merge daha öngörülebilir sonuçlar sağlamak için bulabilirsiniz. (Bu aynı zamanda, veri çıkışı için sanatçı korur.)

NickF dediğim gibi, ben bir veritabanı ile yapmak değil iyi bir nedeniniz var zannedebilir? Bunun için SQL, gibi, çok basit olurdu

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

Eğer olsa, girdiyi emin olun, preg_grep aramalar için kullanabilirsiniz:

$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));
}