22

この投稿は、この質問にほぼ答えていますが、特定のニーズがあり、探していたものが見つかりませんでした. これは私の経験のすぐ外にあります。頭を包み込むことができなかったので、本当に必要なのは正しい方向へのポイントだけです。

次のような配列があるとしましょう。

array(5) { 
    [0]=> "2013-02-18 05:14:54" 
    [1]=> "2013-02-12 01:44:03" 
    [2]=> "2013-02-05 16:25:07" 
    [3]=> "2013-01-29 02:00:15" 
    [4]=> "2013-01-27 18:33:45" 
}

日付 (たとえば、「2013-02-04 14:11:16」) を提供する方法が必要であり、配列内でこれに最も近い一致を関数に決定させます (「2013-02」になります)。 -05 16:25:07" この場合)。

ヒントをいただければ幸いです。ありがとう!:)

4

5 に答える 5

31

私は最善の命名規則を持っていないかもしれませんが、ここに行きます.

日付の配列と指定された日付の間の間隔を計算します。次に、「最小」の差を見つけるために並べ替えを行います。

$dates = array
(
    '0'=> "2013-02-18 05:14:54",
    '1'=> "2013-02-12 01:44:03",
    '2'=> "2013-02-05 16:25:07",
    '3'=> "2013-01-29 02:00:15",
    '4'=> "2013-01-27 18:33:45"
);


function find_closest($array, $date)
{
    //$count = 0;
    foreach($array as $day)
    {
        //$interval[$count] = abs(strtotime($date) - strtotime($day));
        $interval[] = abs(strtotime($date) - strtotime($day));
        //$count++;
    }

    asort($interval);
    $closest = key($interval);

    echo $array[$closest];
}

find_closest($dates, "2013-02-18 05:14:55");
于 2013-02-22T05:50:58.653 に答える
2

あなたの質問を完全に理解できれば、これで問題は解決します。

テスト済みコード

<?php
    $dates = array
    (
        '0' => "2013-02-18 05:14:54",
        '1' => "2013-02-12 01:44:03",
        '2' => "2013-02-05 16:25:07",
        '3' => "2013-01-29 02:00:15",
        '4' => "2013-01-27 18:33:45"
    );

    function closest($dates, $findate)
    {
        $newDates = array();

        foreach($dates as $date)
        {
            $newDates[] = strtotime($date);
        }

        echo "<pre>";
        print_r($newDates);
        echo "</pre>";

        sort($newDates);
        foreach ($newDates as $a)
        {
            if ($a >= strtotime($findate))
                return $a;
        }
        return end($newDates);
    }

    $values = closest($dates, date('2013-02-04 14:11:16'));
    echo date('Y-m-d h:i:s', $values);
?>
于 2013-02-22T05:33:08.983 に答える
1

配列がより大きく、 から までの期間の日付があるとし2009-10-01ます2019-10-01。2 つのアプローチを比較してみましょう。looping-array approach対b。sorting-indexing-array approach.

<?php 

$period = new DatePeriod(
    new DateTime('2009-10-01 00:00:00'),
    new DateInterval('P3D'),
    new DateTime('2019-10-01 00:00:00')
);

foreach($period as $date){ 
    $dates[] = $date->format('Y-m-d'); 
};


$today = '2019-08-18 13:00:15';

function custom_sort($array){
  sort($array);
  return $array;
}

function nearest_date_key($array, $today){
    //push today to the array, sort the array, 
    //find the nearest day value of the sorted array and return key
    array_push($array, $today);
    $sorted_dates = custom_sort($array);
    $find_today_key = array_search($today, $sorted_dates);
    $nearest_date = array_slice($sorted_dates, $find_today_key + 1, 1);
    return array_search($nearest_date[0], $array);
}


function find_closest($array, $today)
{
    //$count = 0;
    foreach($array as $day)
    {
        //$interval[$count] = abs(strtotime($date) - strtotime($day));
        $interval[] = abs(strtotime($today) - strtotime($day));
        //$count++;
    }

    asort($interval);
    $closest = key($interval);
    return $closest;
}

$start = microtime(true);
$result_a = nearest_date_key($dates, $today);
$time_elapsed_secs_a = microtime(true) - $start;

$start = microtime(true);
$result_b = find_closest($dates, $today);
$time_elapsed_secs_b = microtime(true) - $start;
?>

結果を印刷すると ( http://phptester.net/ )

                            result  time_elapsed
loop approach (a)           1203    0.00630   
sorting index approach (b)  1203    0.00062

これは、経過時間の大幅な増加です。待ち時間を10で割りました

于 2019-08-16T13:18:50.997 に答える
0

これを試してみてください:

$date = array(
    [0]=> "2013-02-18 05:14:54"
    [1]=> "2013-02-12 01:44:03"
    [2]=> "2013-02-05 16:25:07"
    [3]=> "2013-01-29 02:00:15"
    [4]=> "2013-01-27 18:33:45");

$baseDate = date_create('2009-10-11');
$count = count($date);
for($loop=0;$count>$loop;$loop++) {
    $datetime = date_create($date[$loop]);
    $interval = date_diff($baseDate, $datetime);
    $newDate[$interval->format('%s')] = $date[$loop];
}
ksort($newDate);
foreach($newDate as $key=>$value) {
    echo $value;
    break;
}

最初の要素は、最も近い一致日になります。

注:使用前にテストしてください。

于 2013-02-22T04:35:19.107 に答える