配列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
)
)
)
)

回答の条件
  • 1人3回まで
  • 登録:2009/03/16 22:17:18
  • 終了:2009/03/23 22:20:02

回答(4件)

id:pahoo No.1

pahoo回答回数5960ベストアンサー獲得回数6332009/03/16 23:11:01

ポイント27pt

ご質問の要素が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);
?>
id:hopefully

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

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

問題ないでしょうか?

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

2009/03/17 16:33:31
id:GoldenDawn No.2

GoldenDawn回答回数426ベストアンサー獲得回数812009/03/16 23:18:38

ポイント27pt

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

<?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>' ;
?>
id:shiroxcom No.3

しろっくす回答回数140ベストアンサー獲得回数52009/03/16 23:56:27

ポイント26pt

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

<?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|<

質問者が未読の回答一覧

 回答者回答受取ベストアンサー回答時間
1 pahoo 5960 5695 633 2009-03-17 16:51:02

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

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

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

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

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