人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

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毎に出力するコードについて、
なるべくスマートなコードを教えてください。

●質問者: kou32rr
●カテゴリ:インターネット ウェブ制作
✍キーワード:AAA Apple PHP コード スマート
○ 状態 :終了
└ 回答数 : 3/3件

▽最新の回答へ

1 ● pahoo
●50ポイント

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

//並べ替え
$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 />';
 }
}
◎質問者からの返答

ありがとうございます。

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

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

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

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


2 ● Mook
●50ポイント ベストアンサー

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";
 }
?>
◎質問者からの返答

ありがとうございます。

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

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

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

array_multisortは知りませんでした。

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


3 ● GoldenDawn
●50ポイント
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" ;
}
◎質問者からの返答

ありがとうございます。

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

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

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

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

関連質問


●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ