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

回答の条件
  • 1人2回まで
  • 13歳以上
  • 登録:2011/04/05 15:34:53
  • 終了:2011/04/05 18:57:59

ベストアンサー

id:y-kawaz No.2

y-kawaz回答回数1420ベストアンサー獲得回数2252011/04/05 16:02:42

ポイント42pt

こんな感じでしょうか?

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

)
id:seadwell

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

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

勉強になります。

2011/04/05 16:20:10

その他の回答(1件)

id:omoon No.1

omoon回答回数7ベストアンサー獲得回数12011/04/05 15:37:19

ポイント28pt

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
        )

)
id:seadwell

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

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

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

よろしくお願いします。

2011/04/05 15:47:49
id:y-kawaz No.2

y-kawaz回答回数1420ベストアンサー獲得回数2252011/04/05 16:02:42ここでベストアンサー

ポイント42pt

こんな感じでしょうか?

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

)
id:seadwell

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

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

勉強になります。

2011/04/05 16:20:10
  • id:omoon
    >|php|

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

    $cnt = 0;
    foreach ($tmp_array as $key => $val) {
    $cnt++;
    if (strtotime($key) < mktime(0, 0, 0, date("m") - 1, date("d"), date("Y"))) {
    break;
    }
    $result_array[] = $val;
    if ($cnt == 3) {
    break;
    }
    }

    print_r($result_array);
    ||<

    こうかな。
    このデータだと結果は一緒ですね。
  • id:y-kawaz
    ちなみに PHPのバージョンが5.3以上であれば文字列じゃなく↓こんなふうに書けます。

    $result = array_filter($arr, function($a) {
    return time()-31*24*3600<strtotime($a["reg_date"]);
    });
  • id:sayo221sayo
    いつからここ回答欄になったっけか?
  • id:seadwell
    y-kawazさん、omoonさんコメントでのフォローありがとうございます。
    いずれも動作確認しました。
    PHPバージョンあげようかな?

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

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

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

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