繁体   English   中英

PHP - 从数组中获取最近的日期

[英]PHP - get closest date from array

如果 $array['date'] 中的值不同,我想从 $search_date 中获取最近的日期。 如果 $array['date'] 中的值相同,我想要所有数组。

  • 格式日期是'Ym-d'。

示例 1:

$search_date = '2022-12-08';
$array = [{"price":"200","date":"2022-12-12"},{"price":"50","date":"2022-12-10"},{"price":"100","date":"2022-12-10"}]
Return should be: [{"price":"50","date":"2022-12-10"},{"price":"100","date":"2022-12-10"}]

示例 2:

$search_date = '2022-12-08';
$array = [{"price":"200","date":"2022-12-08"},{"price":"50","date":"2022-12-09"},{"price":"100","date":"2022-12-11"}]
Return should be: [{"price":"200","date":"2022-12-08"}]

示例 3:

$search_date = '2022-12-08';
$array = [{"price":"200","date":"2022-12-10"},{"price":"100","date":"2022-12-10"},{"price":"50","date":"2022-12-11"}]
Return should be: [{"price":"200","date":"2022-12-10"},{"price":"100","date":"2022-12-10"}]

示例 4:

$search_date = '2022-12-08';
$array = [{"price":"200","date":"2022-12-08"},{"price":"100","date":"2022-12-08"},{"price":"50","date":"2022-12-08"}]
Return should be: [{"price":"200","date":"2022-12-08"},{"price":"100","date":"2022-12-08"},{"price":"50","date":"2022-12-08"}]

谢谢!

此代码计算$search和每条记录之间的天数距离。 它假设您想要找到未来和过去的最近距离。

<?php

/*

Question Author: Catalin Iamandei
Question Answerer: Jacob Mulquin
Question: PHP - get closest date from array
URL: https://stackoverflow.com/questions/74598442/php-get-closest-date-from-array
Tags: php, arrays, laravel, date, php-carbon

*/

$search = '2022-12-10';
$searchObj = new DateTime($search);

$records = json_decode('[{"price":"200","date":"2022-12-10"},{"price":"100","date":"2022-12-10"},{"price":"50","date":"2022-12-11"}]', true);

$distances = [];
foreach ($records as $index => $record) {
    $recordObj = new DateTime($record['date']);
    $daysDiff = $searchObj->diff($recordObj)->format("%r%a");
    $distances[$index] = abs($daysDiff);
}

$minimumDiff = min($distances);

$output = [];
foreach ($distances as $index => $distance) {
    if ($distance == $minimumDiff) {
        $output[] = $records[$index];
    }
}

echo json_encode($output, JSON_PRETTY_PRINT);

产量:

[
    {
        "price": "50",
        "date": "2022-12-09"
    },
    {
        "price": "100",
        "date": "2022-12-11"
    }
]

如果您只想搜索未来最接近的日期,则需要删除abs() function,然后在使用min()之前删除$distances数组中的所有负项。

如果您想在数组中搜索特定值,您是否尝试过

array_search($value, $array); 

通过这个你可以在你的数组中搜索一个特定的值


如果你想搜索最低值

尝试 for 循环你的数组并检查数组是否低于前一个索引以及 for 循环是否结束你有最低日期

$lowest_date = null;

for ($i = 0; count($i); $i++) {
    if ($array['date'] < $lowest_date) {
        $lowest_date = $array['date'];
    }
}

你没有提到如何处理之前的日期,例如。 搜索'2022-12-07' ,如何踩2022-12-062022-12-08 ,因为两者的差值为 1。您可以计算每个条目的日期差异,使用此获取最小日期差异和 output 元素日期差异。 例如:

<?php
$SearchDate = new DateTimeImmutable('2022-12-08');
$array      = array ('{"price":"200","date":"2022-12-12"}',
    '{"price":"50","date":"2022-12-10"}',
    '{"price":"100","date":"2022-12-10"}');
$laResult = array();
foreach($array as $jsonO) {
    $json             = json_decode($jsonO);
    $CompareDate      = new DateTimeImmutable($json->{'date'});
    $interval         = date_diff($SearchDate, $CompareDate);
    $laThis['date']   = $json->{'date'};
    $laThis['diff']   = $interval->format('%a');
    $laThis['origin'] = $jsonO;
    $laResult[]       = $laThis;
}

$min_diff = min( array_column( $laResult, 'diff') );
echo 'nearestDiff:'. $min_diff .PHP_EOL;
foreach($laResult as $laSingleResult) {
    if($laSingleResult['diff'] == $min_diff) {
        echo $laSingleResult['origin'] .PHP_EOL;
    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM