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

php5.1.6のsortに関する質問です。
以下のような配列を、dateの部分で大きい順番で並べ替え、現在より1ケ月以内のデータ、かつ、大きい順から3件だけ抜き出すにはどのように書けばいいですか?

Array (
[0] => Array ( [user_id] => 3 [user_name] => やまだ [reg_date] => 2011-04-01 14:24:33 )
[1] => Array ( [user_id] => 6 [user_name] => かわだ [reg_date] => 2011-02-15 12:20:00 )
[2] => Array ( [user_id] => 15 [user_name] => ふじた [reg_date] => 2011-03-04 18:03:33 )
[3] => Array ( [user_id] => 23 [user_name] => かめだ [reg_date] => 2011-02-23 02:24:33 )
[4] => Array ( [user_id] => 66 [user_name] => たなか [reg_date] => 2011-03-09 13:24:06 ) )

これを以下のように並べ替え、X件だけ抽出

Array (
[0] => Array ( [user_id] => 66 [user_name] => たなか [reg_date] => 2011-03-09 13:24:06 )
[1] => Array ( [user_id] => 3 [user_name] => やまだ [reg_date] => 2011-04-01 14:24:33 ) )

●質問者: seadwell
●カテゴリ:ウェブ制作
✍キーワード:00 2011-02-15 2011-02-23 2011-03-04 2011-03-09
○ 状態 :終了
└ 回答数 : 2/2件

▽最新の回答へ

1 ● omoon
●28ポイント

reg_date がキーのテンポラリ配列を作って、krsortで並べ替えればいいと思います。

<?php
// 元の配列
$org_array = array(
 array(
 'user_id' => 3,
 'user_name' => 'やまだ',
 'reg_date' => '2011-04-01 14:24:33'
 ),
 array(
 'user_id' => 6,
 'user_name' => 'かわだ',
 'reg_date' => '2011-03-15 12:20:00'
 ),
 array(
 'user_id' => 15,
 'user_name' => 'ふじた',
 'reg_date' => '2011-03-05 18:03:33'
 ),
 array(
 'user_id' => 23,
 'user_name' => 'かめだ',
 'reg_date' => '2011-02-23 14:24:33'
 ),
 array(
 'user_id' => 66,
 'user_name' => 'たなか',
 'reg_date' => '2011-04-05 13:24:06'
 ),
);

// キーをreg_dateにするテンポラリ配列
$tmp_array = array();

// 結果を格納する配列
$result_array = array();

foreach ($org_array as $key => $val) {
 $tmp_array[$val['reg_date']] = $val;
}

krsort($tmp_array);

foreach ($tmp_array as $key => $val) {
 $result_array[] = $val;
}

print_r(array_slice($result_array, 0, 3));

結果。

Array
(
 [0] => Array
 (
 [user_id] => 66
 [user_name] => たなか
 [reg_date] => 2011-04-05 13:24:06
 )

 [1] => Array
 (
 [user_id] => 3
 [user_name] => やまだ
 [reg_date] => 2011-04-01 14:24:33
 )

 [2] => Array
 (
 [user_id] => 6
 [user_name] => かわだ
 [reg_date] => 2011-03-15 12:20:00
 )

)
◎質問者からの返答

丁寧なご回答ありがとうございます。

条件に1カ月以内というのが加わりました。

回答いただいている最中に質問を変更しまして申しわけありません。

よろしくお願いします。


2 ● y-kawaz
●42ポイント ベストアンサー

こんな感じでしょうか?

<?php
$arr = array(
 array('user_id' => 3, 'user_name' => 'やまだ', 'reg_date' => '2011-04-01 14:24:33'),
 array('user_id' => 6, 'user_name' => 'かわだ', 'reg_date' => '2011-03-15 12:20:00'),
 array('user_id' => 15, 'user_name' => 'ふじた', 'reg_date' => '2011-03-05 18:03:33'),
 array('user_id' => 23, 'user_name' => 'かめだ', 'reg_date' => '2011-02-23 14:24:33'),
 array('user_id' => 66, 'user_name' => 'たなか', 'reg_date' => '2011-04-05 13:24:06'),
);

$result = array_filter($arr, create_function('$a', 'return time()-31*24*3600<strtotime($a["reg_date"]);'));
usort($result, create_function('$a, $b', 'return $a["reg_date"]==$b["reg_date"]?0:($a["reg_date"]<$b["reg_date"]?1:-1);'));
$result = array_slice($result, 0, 3);
print_r($result);

Array
(
 [0] => Array
 (
 [user_id] => 3
 [user_name] => やまだ
 [reg_date] => 2011-04-01 14:24:33
 )

 [1] => Array
 (
 [user_id] => 6
 [user_name] => かわだ
 [reg_date] => 2011-03-15 12:20:00
 )

 [2] => Array
 (
 [user_id] => 15
 [user_name] => ふじた
 [reg_date] => 2011-03-05 18:03:33
 )

)
◎質問者からの返答

ご回答ありがとうございます。

create_functionって関数初めて知りました。面白いですね。

勉強になります。

関連質問


●質問をもっと探す●



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