phpでの質問です。


$list = array();
$list[] = array('id' => 1, 'product' => 'mikan', 'maker' => 'AAA');
$list[] = array('id' => 2, 'product' => 'pork', 'maker' => 'BBB');
   $list[] = array('id' => 3, 'product' => 'apple', 'maker' => 'AAA');
$list[] = array('id' => 4, 'product' => 'chicken', 'maker' => 'BBB');
$list[] = array('id' => 5, 'product' => 'beef', 'maker' => 'BBB');

上記のような配列があったとします。

これを結果(出力)として、

maker-AAAの商品
1-mikan
3-apple

maker-BBBの商品
2-pork
4-chicken
5-beef

というように、 maker で分け、maker毎に出力するコードについて、
なるべくスマートなコードを教えてください。

回答の条件
  • 1人2回まで
  • 登録:2008/06/11 22:34:56
  • 終了:2008/06/12 09:35:32

ベストアンサー

id:Mook No.2

Mook回答回数1312ベストアンサー獲得回数3912008/06/11 23:10:41

ポイント50pt

array_multisort を使用した例ですが、どうでしょうか。

<?
// データの初期化
    $list[] = array('id' => 1, 'product' => 'mikan', 'maker' => 'AAA');
    $list[] = array('id' => 2, 'product' => 'pork', 'maker' => 'BBB');
    $list[] = array('id' => 3, 'product' => 'apple', 'maker' => 'AAA');
    $list[] = array('id' => 4, 'product' => 'chicken', 'maker' => 'BBB');
    $list[] = array('id' => 5, 'product' => 'beef', 'maker' => 'BBB');

// 配列のソート
    foreach ($list as $v) { 
        $makers[] = $v['maker'];
        $ids[] = $v['id'];
    }
    array_multisort($makers, SORT_ASC, SORT_STRING,  $ids, SORT_ASC, SORT_NUMERIC, $list);

// 表示処理
    $maker ="";
    foreach( $list as $pd=>$rec ) {
        if ( $maker != $rec['maker'] ) {
            if ( $maker != "" )
                echo "<BR>\n";
            $maker = $rec['maker'];
            echo "maker-".$maker."の商品<BR>\n";
        }
        echo $rec['id']."-".$rec['product']."<BR>\n";
    }
?>
id:kou32rr

ありがとうございます。

皆様のそれぞれ違うコードで再現を全て確認でき、

質問してよかったと思っています。

これからやりたいこととの関連性も考慮しながら活用させていただきます。

array_multisortは知りませんでした。

これが一番理解しやすそうです。

2008/06/12 09:33:43

その他の回答(2件)

id:pahoo No.1

pahoo回答回数5960ベストアンサー獲得回数6332008/06/11 23:09:09

ポイント50pt

ベタな書き方ですが――。

//並べ替え
$olist = array();
foreach ($list as $elem) {
    $olist[$elem['maker']][] = $elem['id'] . '-' . $elem['product'];
}

//表示
foreach ($olist as $maker=>$elem1) {
    echo 'maker-' . $maker . 'の製品<br />';
    foreach ($elem1 as $elem2) {
        echo $elem2 . '<br />';
     }
}
id:kou32rr

ありがとうございます。

皆様のそれぞれ違うコードで再現を全て確認でき、

質問してよかったと思っています。

これからやりたいこととの関連性も考慮しながら活用させていただきます。

これが一番シンプルでしょうか。。。

2008/06/12 09:33:10
id:Mook No.2

Mook回答回数1312ベストアンサー獲得回数3912008/06/11 23:10:41ここでベストアンサー

ポイント50pt

array_multisort を使用した例ですが、どうでしょうか。

<?
// データの初期化
    $list[] = array('id' => 1, 'product' => 'mikan', 'maker' => 'AAA');
    $list[] = array('id' => 2, 'product' => 'pork', 'maker' => 'BBB');
    $list[] = array('id' => 3, 'product' => 'apple', 'maker' => 'AAA');
    $list[] = array('id' => 4, 'product' => 'chicken', 'maker' => 'BBB');
    $list[] = array('id' => 5, 'product' => 'beef', 'maker' => 'BBB');

// 配列のソート
    foreach ($list as $v) { 
        $makers[] = $v['maker'];
        $ids[] = $v['id'];
    }
    array_multisort($makers, SORT_ASC, SORT_STRING,  $ids, SORT_ASC, SORT_NUMERIC, $list);

// 表示処理
    $maker ="";
    foreach( $list as $pd=>$rec ) {
        if ( $maker != $rec['maker'] ) {
            if ( $maker != "" )
                echo "<BR>\n";
            $maker = $rec['maker'];
            echo "maker-".$maker."の商品<BR>\n";
        }
        echo $rec['id']."-".$rec['product']."<BR>\n";
    }
?>
id:kou32rr

ありがとうございます。

皆様のそれぞれ違うコードで再現を全て確認でき、

質問してよかったと思っています。

これからやりたいこととの関連性も考慮しながら活用させていただきます。

array_multisortは知りませんでした。

これが一番理解しやすそうです。

2008/06/12 09:33:43
id:GoldenDawn No.3

GoldenDawn回答回数426ベストアンサー獲得回数812008/06/11 23:42:43

ポイント50pt
usort($list, create_function(
  '$a, $b',
  '$ret = strcmp($a["maker"], $b["maker"]) ; // メーカー名でソート
   if ($ret == 0) $ret = $a["id"] > $b["id"] ? 1 : -1 ; // メーカーが同じ場合は id でソート
   return $ret ;'
  )) ;

for ($i = 0; $i < count($list); ++$i) {
  if ($i == 0 || $list[$i]['maker'] != $list[$i-1]['maker'])
    echo 'maker-'.$list[$i]['maker']."の商品<br/>\n" ;
  echo $list[$i]['id'].'-'.$list[$i]['product']."<br>\n" ;
}
id:kou32rr

ありがとうございます。

皆様のそれぞれ違うコードで再現を全て確認でき、

質問してよかったと思っています。

これからやりたいこととの関連性も考慮しながら活用させていただきます。

私がよく使う書き方とは異なりますが、勉強の為後でよく理解させていただきます。

2008/06/12 09:34:49

コメントはまだありません

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません