Выборочное выравнивание массива PHP в соответствии с родительскими ключами - PullRequest
0 голосов
/ 11 мая 2009

Мне нужно выборочно сгладить массив в PHP, но делать это выборочно. Если ключ соответствует шаблону, тогда все подэлементы ниже этого ключа должны быть включены в «плоский» вывод.

ТАК Если бы у меня был каталог музыки:

=> массив альбомов => каждый из которых представляет собой массив названий песен

Тогда я мог бы искать строку и получить в ответ плоский массив. Поэтому, если бы я искал «sun», я бы получил весь каталог для любого исполнителя с «sun» в названии, плюс альбомы для других исполнителей, где «sun» было в названии альбома.

Надеюсь, это имеет смысл.

У кого-нибудь есть мысли?

Ответы [ 6 ]

3 голосов
/ 11 мая 2009

Есть ли причина, по которой вы не используете базу данных для хранения значительного объема информации? Было бы довольно просто написать запрос на SQL, чтобы вытащить нужные данные.

1 голос
/ 11 мая 2009

Хорошо, я предполагаю, что ваши данные выглядят так:

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

... и что с учетом ввода "Bill", вы хотите вывод: ["Lovely Day", "Use Me", "Ain't No Sunshine", "Piano Man"]. Вот один из способов сделать это.

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

... Я также предполагаю, что у вас есть веская причина не использовать базу данных для этого.

0 голосов
/ 11 мая 2009

Вы можете использовать preg_grep для поиска, обязательно очистите входные данные, хотя:

$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));
}
0 голосов
/ 11 мая 2009

Чтобы построить работу 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;
0 голосов
/ 11 мая 2009
$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 голосов
/ 11 мая 2009

Вы имеете в виду что-то подобное?

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