2

PHPで、同じ年、月、日がより高い時刻を持つ配列から日付を削除する方法は?

array(7) { 
    [0]=> string(19) "2012-06-11 08:30:49" 
    [1]=> string(19) "2012-06-11 08:03:54" 
    [2]=> string(19) "2012-05-26 23:04:04" 
    [3]=> string(19) "2012-05-27 08:30:00" 
    [4]=> string(19) "2012-06-08 08:30:55" 
    [5]=> string(19) "2012-06-08 08:31:12" 
    [6]=> string(19) "2012-06-08 08:55:24"
}

削除しますarray[0],array[5],array[6]

出力:

('2012-06-11 08:03:54',''2012-05-26 23:04:04','2012-05-27 08:30:00','2012-06-08 08:30:55')

また

'2012-06-11 08:03:54'
'2012-05-26 23:04:04'
'2012-05-27 08:30:00'
'2012-06-08 08:30:55'

つまり、異なる日の最も早い日付のみが必要です。

4

4 に答える 4

1
$filtered = array();
foreach ($array as $time) {
    $day = date('Y-m-d', strtotime($time));
    if (!isset($filtered[$day]) || strtotime($filtered[$day]) > strtotime($time)) {
        $filtered[$day] = $time;
    }
}
于 2012-10-10T07:31:14.603 に答える
1

使ってみることができますusort

$array = array( 
    "2012-06-11 08:30:49" ,
    "2012-06-11 08:03:54" ,
    "2012-05-26 23:04:04" ,
    "2012-05-27 08:30:00" ,
    "2012-06-08 08:30:55" ,
    "2012-06-08 08:31:12" ,
    "2012-06-08 08:55:24"
);


usort($array, function ($a, $b) {
    $a = strtotime($a);
    $b = strtotime($b);
    return ($a == $b) ? 0 : (($a > $b) ? - 1 : 1);
});

$list = array();
foreach ( $array as $time ) {
    $day = date('Y-m-d', strtotime($time));
    if (! array_key_exists($day, $list))
        $list[$day] = $time;
}

var_dump($list);

出力

array
  '2012-06-11' => string '2012-06-11 08:30:49' (length=19)
  '2012-06-08' => string '2012-06-08 08:55:24' (length=19)
  '2012-05-27' => string '2012-05-27 08:30:00' (length=19)
  '2012-05-26' => string '2012-05-26 23:04:04' (length=19)
于 2012-10-10T08:07:57.397 に答える
1

1 つの方法は、並べ替えられた配列をループして、日付が一定のままである場合に、より高い時刻の値を削除することです。以下は作業コードです:

echo '<pre>';
$in = array(
    '2012-06-11 08:30:49',
    '2012-06-11 08:03:54',
    '2012-05-26 23:04:04',
    '2012-05-27 08:30:00',
    '2012-06-08 08:31:12',
    '2012-06-08 08:30:55',
    '2012-06-08 08:55:24',
);
var_dump($in);

$out = $in;
sort($out, SORT_STRING);
for($i=count($out)-2; $i>=0; --$i)
{
    list($d1, $t1) = explode(' ', $out[$i+1]);
    list($d2, $t2) = explode(' ', $out[$i]);
    if($d1 == $d2 && $t2 <= $t1) //same date and lower time
    {
        unset($out[$i+1]);
    }
}

var_dump($out);
echo '</pre>';

要素の順序が重要でない場合、このアプローチは十分に高速です。これは、php のsort()関数を使用しており、コードで実行される時間のかかる唯一のことは、O(n) 時間かかる配列をループすることだからです。

また、元の配列を保持する必要がない場合は、どこでも置き換え$outて行を削除できます。追加の配列が作成されないため、メモリ使用量が改善されます。$in$out=$in

于 2012-10-10T08:23:06.283 に答える
1
$array = array( 
    "2012-06-11 08:30:49" ,
    "2012-06-11 08:03:54" ,
    "2012-05-26 23:04:04" ,
    "2012-05-27 08:30:00" ,
    "2012-06-08 08:30:55" ,
    "2012-06-08 08:31:12" ,
    "2012-06-08 08:55:24"
);

$new_array = array();
foreach($array as $item){
    $item_array = explode(" ", $item);
    $date = $item_array[0];
    $time = $item_array[1];
    if(!isset($new_array[$date]) || $time < $new_array[$date])
        $new_array[$date] = $time;
}

$final = array();

foreach($new_array as $key => $value){
    $final[] = $key . ' ' . $value;
}

print_r($final);
于 2012-10-10T07:34:35.223 に答える