Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
根据父键选择性地展平PHP数组_Php_Arrays - Fatal编程技术网

根据父键选择性地展平PHP数组

根据父键选择性地展平PHP数组,php,arrays,Php,Arrays,我需要在PHP中有选择地展平数组,但要有选择地这样做。如果某个键与某个模式匹配,则该键下的所有子元素都应包含在“平坦”输出中 如果我有一本音乐目录: =>专辑数组=>每个专辑都是歌曲标题数组 然后我可以搜索一个字符串,得到一个平面数组作为响应。因此,如果我搜索“sun”,那么我将获得所有以“sun”为名的艺术家的完整目录,以及其他以“sun”为名的艺术家的专辑 希望这是有道理的 有人有什么想法吗?你为什么不使用数据库来存储听起来像是大量信息?用SQL编写查询以提取所需的数据是相当简单的。有没有理

我需要在PHP中有选择地展平数组,但要有选择地这样做。如果某个键与某个模式匹配,则该键下的所有子元素都应包含在“平坦”输出中

如果我有一本音乐目录:

=>专辑数组=>每个专辑都是歌曲标题数组

然后我可以搜索一个字符串,得到一个平面数组作为响应。因此,如果我搜索“sun”,那么我将获得所有以“sun”为名的艺术家的完整目录,以及其他以“sun”为名的艺术家的专辑

希望这是有道理的


有人有什么想法吗?

你为什么不使用数据库来存储听起来像是大量信息?用SQL编写查询以提取所需的数据是相当简单的。

有没有理由不使用数据库来存储听起来像是大量信息的内容?用SQL编写查询以提取所需的数据是相当简单的。

您的意思是这样的吗

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

你的意思是这样的吗

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

好的,我假设您的数据如下所示:

$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”
,您需要输出:
[“可爱的一天”,“使用我”,“没有阳光”,“钢琴手”]
。这里有一种方法你可以做到

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

…我还假设您有充分的理由不为此使用数据库。

好的,我假设您的数据如下所示:

$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"
    )
);
$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;
}   
…如果输入
“Bill”
,您需要输出:
[“可爱的一天”,“使用我”,“没有阳光”,“钢琴手”]
。这里有一种方法你可以做到

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

…我还假设您有充分的理由不使用数据库进行此操作。

要以NickF的工作为基础,假设您的数据看起来像他的,我会这样编写函数

$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;
}   
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
,可以提供比我自己经验中的数组合并更可预测的结果。(这也保留了艺术家输出数据的功能。)

就像NickF说的,我认为你有充分的理由不使用数据库?用于此的SQL非常简单,例如

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

为了构建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
,可以提供比我自己经验中的数组合并更可预测的结果。(这也保留了艺术家输出数据的功能。)

就像NickF说的,我认为你有充分的理由不使用数据库?用于此的SQL非常简单,例如

SELECT artist, song FROM songs WHERE artist LIKE '%Bill%' GROUP BY artist;
您可以使用进行搜索,但请确保对输入进行清理:

$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));
}
您可以使用进行搜索,但请确保对输入进行清理:

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