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

ネイティブPHP関数array_merge_recursive()は、splat演算子のおかげで、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 に答える