[英]Selectively flattening a PHP array according to parent keys
我需要在PHP中有选择地展平数组,但是有选择地做。 如果某个键与某个模式匹配,则该键下面的所有子元素都应包含在“ flat”输出中。
所以,如果我有音乐目录:
=>专辑数组=>每个专辑都是一个歌曲标题数组
然后,我可以搜索一个字符串,并在响应中得到一个平面数组。 因此,如果我搜索“ sun”,那么我将获得名称中带有“ sun”的任何艺术家的完整目录,以及专辑名称中包含“ sun”的其他艺术家的专辑。
希望这是有道理的。
有人有什么想法吗?
您没有使用数据库来存储听起来像大量信息的原因吗? 用SQL编写查询以提取所需的数据将非常简单。
好的,我假设您的数据如下所示:
$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;
}
...我还将假设您有充分的理由不为此使用数据库。
你的意思是那样吗?
$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;
}
$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;
}
为了增强NickF的工作,假设您的数据看起来像他的数据,我将以这种方式编写该函数。
function getSongs($data, $searchTerm) {
foreach ($data as $artist => $songs) {
if (stripos($artist, $searchTerm) !== false)) {
$output[$artist] = $songs;
}
}
return $output or null;
}
当没有找到匹配项时,此函数的结果显然将返回null而不是空白数组; 当找到几个匹配项时,它们将按其艺术家分组。 我发现直接分配$output[$artist] = $songs
可以提供比array_merge更好的可预测结果。 (这也保留了艺术家用于输出该数据的信息。)
就像NickF所说的那样,我认为您有充分的理由不对数据库执行此操作? 为此,SQL将非常简单,例如,
SELECT artist, song FROM songs WHERE artist LIKE '%Bill%' GROUP BY artist;
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.