我需要在PHP中有选择地展平数组,但是有选择地做。如果一个键与一个模式匹配,那么该键下面的所有子元素都应该包含在'flat'输出中。
如果我有一个音乐目录:
=>专辑数组=>每个都是一系列歌曲标题
然后我可以搜索一个字符串,并在响应中得到一个平面数组。因此,如果我搜索“太阳”,那么我会得到任何名字中带有'sun'的艺术家的整个目录,以及其他艺术家的专辑,其中'sun'在专辑名称中。
希望这是有道理的。
有人有任何想法吗?
答案 0 :(得分:3)
您是否有理由不使用数据库来存储大量信息?在SQL中编写查询以提取所需的数据会非常简单。
答案 1 :(得分:1)
好的,我假设你的数据是这样的:
$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;
}
...我还假设你有充分的理由不为此使用数据库。
答案 2 :(得分:0)
你的意思是什么?
$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;
}
答案 3 :(得分: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;
}
答案 4 :(得分:0)
为了建立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;
答案 5 :(得分:0)
您可以使用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));
}