2

我有一个名为 的多维数组$songs,它输出以下内容:

Array
(
    [0] => Array
        (
            [Michael Jackson] => Thriller
        )

    [1] => Array
        (
            [Michael Jackson] => Rock With You
        )

    [2] => Array
        (
            [Teddy Pendergrass] => Love TKO
        )

    [3] => Array
        (
            [ACDC] => Back in Black
        )
)

我想合并具有重复键的数组,所以我可以得到以下内容:

Array
(
    [0] => Array
        (
            [Michael Jackson] => Array
            (
                [0] => Thriller
                [1] => Rock With You
            )
        )

    [1] => Array
        (
            [Teddy Pendergrass] => Love TKO
        )

    [2] => Array
        (
            [ACDC] => Back in Black
        )
)

我该怎么做呢?

给我输出数组的代码,如:

<h2>Michael Jackson</h2>
<ul>
    <li>Thriller</li>
    <li>Rock With You</li>
</ul>

<h2>Teddy Pendergrass</h2>
<ul>
    <li>Love TKO</li>
</ul>

<h2>ACDC</h2>
<ul>
    <li>Back in Black</li>
</ul>
4

2 回答 2

12

这应该可以做到,这不是您想要的,但我看不出您需要以数字方式索引结果数组,然后由艺术家索引的原因。

$source = array(
    array('Michael Jackson' => 'Thriller'),
    array('Michael Jackson' => 'Rock With You'),
    array('Teddy Pendergrass' => 'Love TKO'),
    array( 'ACDC' => 'Back in Black')
);

$result = array();

foreach($source as $item) {
    $artist = key($item);
    $album = current($item);

    if(!isset($result[$artist])) {
        $result[$artist] = array();
    }
    $result[$artist][] = $album;
}

您可以像这样循环$result数组并构建您的 HTML:

foreach($result as $artist => $albums) {
    echo '<h2>'.$artist.'</h2>';
    echo '<ul>';
    foreach($albums as $album) {
        echo '<li>'.$album.'</li>';
    }
    echo '</ul>';
}

这将导致您描述的类似列表。

于 2010-01-29T21:55:56.310 回答
0

由于 splat 运算符,本机 PHP 函数array_merge_recursive()将 9 行代码减少到 1 行。

代码:(演示

$result = array_merge_recursive(...$songs);

输出:

array (
  'Michael Jackson' => 
  array (
    0 => 'Thriller',
    1 => 'Rock With You',
  ),
  'Teddy Pendergrass' => 'Love TKO',
  'ACDC' => 'Back in Black',
)

这不会创建您想要的数组结构;它会创建最紧凑的关联数据版本。

在打印数据时,我建议使用 html 模板字符串并将数据输入其占位符。

因为分组的$songs数据可能是标量或可迭代的(由于array_merge_recursive()),所以该变量必须array在将其输入 之前显式转换为类型数据implode()

$template = <<<HTML
<h2>%s</h2>
<ul>
    <li>%s</li>
</ul>

HTML;

foreach ($result as $artist => $songs) {
    printf(
        $template,
        $artist,
        implode('</li><li>', (array)$songs)
    );
}

输出:

<h2>Michael Jackson</h2>
<ul>
    <li>Thriller</li><li>Rock With You</li>
</ul>
<h2>Teddy Pendergrass</h2>
<ul>
    <li>Love TKO</li>
</ul>
<h2>ACDC</h2>
<ul>
    <li>Back in Black</li>
</ul>
于 2021-08-22T10:54:38.777 回答