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

配列A
Array
(
[0] =>array (
[test] => 63705
[hizuke] => array (
[2009-03-14] => array (
[PRICEA] => 2000
[PRICEB] => 1000
)
[2009-03-15] => array (
[PRICEA] => 4000
[PRICEB] => 3000
)
)
)
[1] =>array (
[test] => 63705
[hizuke] => array (
[2009-03-14] => array (
[PRICEA] => 1000
[PRICEB] => 4000
)
[2009-03-15] => array (
[PRICEA] => 2000
[PRICEB] => 1000
)
)
)
)
という配列がありまして、日付とPRICEAまたはPRICEBでソートしたいと
思ってます。PHP5で関数を用意して、行いたいのですが可能でしょうか?

sort_data($hiduke,$ab_flg)などの関数を用意して行いたいです。
$hiduke = 2009-03-14
$ab_flg = b

ときたら、以下のような形で返却したいと思ってます。

Array
(
[0] =>array (
[test] => 63705
[hizuke] => array (
[2009-03-14] => array (
[PRICEA] => 1000
[PRICEB] => 4000
)
[2009-03-15] => array (
[PRICEA] => 2000
[PRICEB] => 1000
)
)
)
[1] =>array (
[test] => 63705
[hizuke] => array (
[2009-03-14] => array (
[PRICEA] => 2000
[PRICEB] => 1000
)
[2009-03-15] => array (
[PRICEA] => 4000
[PRICEB] => 3000
)
)
)
)

●質問者: hopefully
●カテゴリ:就職・転職 コンピュータ
✍キーワード:2009-03-14 2009-03-15 test ソート 配列
○ 状態 :終了
└ 回答数 : 3/4件

▽最新の回答へ

1 ● pahoo
●27ポイント

ご質問の要素が2つだけでソート条件がよく分からないのですが、こういうことですか?

hizuke要素が $hiduke である部分の $ab_flg (aならPRICEA、bならPRICEB)に対応する値を比較し、大きい順に並び替える。

であれば、下記のようなソースでどうでしょう。

<?php
//ユーザー比較関数
function mycmp($a, $b) {
 global $hiduke, $ab_flg;

 $tbl = array('a'=>'PRICEA', 'b'=>'PRICEB');

 return $b['hizuke'][$hiduke][$tbl[$ab_flg]] - $a['hizuke'][$hiduke][$tbl[$ab_flg]];
}

//元の配列
$arr = array(
0 => array(
 'test' => 63705,
 'hizuke' => array(
 '2009-03-14' => array(
 'PRICEA' => 2000,
 'PRICEB' => 1000
 ),
 '2009-03-15' => array(
 'PRICEA' => 4000,
 'PRICEB' => 3000
 )
 )

),
1 => array(
 'test' => 63705,
 'hizuke' => array(
 '2009-03-14' => array(
 'PRICEA' => 1000,
 'PRICEB' => 4000
 ),
 '2009-03-15' => array(
 'PRICEA' => 2000,
 'PRICEB' => 1000
 )
 )
)
);

print_r($arr);
echo "<br />\n";

//パラメータをセット
$hiduke = '2009-03-14';
$ab_flg = 'b';
usort($arr, "mycmp");
print_r($arr);
?>
◎質問者からの返答

return $a['hizuke'][$hiduke][$tbl[$ab_flg]] - $b['hizuke'][$hiduke][$tbl[$ab_flg]];

とやると求めている内容になりました。

問題ないでしょうか?

それと高い順はどうしたらいいのでしょうか?


2 ● GoldenDawn
●27ポイント

指定された日付が存在しないなどのエラーチェックは行っていません。

<?php
function sort_data($ary, $date, $ab) {
 function cmp($a, $b) {
 $da = $a['hizuke'][$date][$ab == 'a' ? 'PRICEA' : 'PRICEB'] ;
 $db = $b['hizuke'][$date][$ab == 'a' ? 'PRICEA' : 'PRICEB'] ;
 if ($da == $db) return 0 ;
 else return ($da > $db) ? -1 : 1 ;
 }

 uasort($ary, cmp) ;
 return $ary ;
}

$a = array(
 0 => Array (
 'test' => 63705,
 'hizuke' => array (
 '2009-03-14' => array (
 'PRICEA' => 2000,
 'PRICEB' => 1000
 ),
 '2009-03-15' => array (
 'PRICEA' => 4000,
 'PRICEB' => 3000
 )
 )
 ),
 1 =>array (
 'test' => 63705,
 'hizuke' => array (
 '2009-03-14' => array (
 'PRICEA' => 1000,
 'PRICEB' => 4000
 ),
 '2009-03-15' => array (
 'PRICEA' => 2000,
 'PRICEB' => 1000
 )
 )
 )
 ) ;

$hiduke = '2009-03-14' ;
$ab_flg = 'b' ;

echo '<pre>' ;
print_r(sort_data($a, $hiduke, $ab_flg)) ;
echo '</pre>' ;
?>

3 ● しろっくす
●26ポイント

こんなのはどうでしょう?

<?php
$ary = array(
        array(
 'test'=>63705,
 'hizuke'=> array(
 '2009-03-14' => array(
 'PRICEA' => 2000,
 'PRICEB' => 1000,
 ),
 '2009-03-15' => array(
 'PRICEA' => 4000,
 'PRICEB' => 3000)
 )
 ),
 array(
 'test'=>63705,
 'hizuke'=> array(
 '2009-03-14' => array(
 'PRICEA' => 2000,
 'PRICEB' => 7000,
 ),
 '2009-03-15' => array(
 'PRICEA' => 4000,
 'PRICEB' => 3000)
 )
 ),
 array(
 'test'=>63705,
 'hizuke'=> array(
 '2009-03-14' => array(
 'PRICEA' => 1000,
 'PRICEB' => 4000,
 ),
 '2009-03-15' => array(
 'PRICEA' => 2000,
 'PRICEB' => 1000)
 ),
 ),
 );
function sort_data($ary,$hizuke,$ab_flg){
 $key = 'PRICE'.strtoupper($ab_flg);
 foreach($ary as $val){
 $sort_key[] = $val['hizuke'][$hizuke][$key];
 }
 array_multisort($sort_key,SORT_DESC,$ary);
 return $ary;
}
?>
|php|<
関連質問


●質問をもっと探す●



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