【问题标题】:Manipulating php array操作php数组
【发布时间】:2012-03-29 02:20:29
【问题描述】:

大家好,我有一个包含日期的数组

Array
(
    [0] => 2012-04-04
    [1] => 2012-04-06
    [2] => 2012-04-06
    [3] => 2012-04-06
    [4] => 2012-04-06
    [5] => 2012-04-06
    [6] => 2012-04-06
    [7] => 2012-04-11
    [8] => 2012-04-12
    [9] => 2012-04-12
    [10] => 2012-04-13
    [11] => 2012-04-13
    [12] => 2012-04-13
    [13] => 2012-04-13
    [14] => 2012-04-13
    [15] => 2012-04-13
    [16] => 2012-04-13
)

我将如何遍历数组并找到数组中相邻项目之间的天数差异。例如,我想回显

[0] 和 [1] 之间的差异是“2”天 [1] 和 [2] 之间的差异是“0”天

:)

设法从最佳答案中获得一些输出,但是我只希望它在日期不同时显示。

虽然这个 if 语句没有输出 - 已更新 -

$count = count($datestack);



for ($i = 0; $i < $count - 1; $i++) {
    $datetime1 = new DateTime($datestack[$i]);
    $datetime2 = new DateTime($datestack[$i + 1]);
    $interval = $datetime1->diff($datetime2);
    if ($arr[$i] === $arr[$i+1]){
     echo $interval->format('%R%a days');
    }

} 

【问题讨论】:

标签: php arrays echo items


【解决方案1】:

你需要的是DateTime::diff

例子:

$datetime1 = new DateTime('2012-04-04');
$datetime2 = new DateTime('2012-04-06');
$interval = $datetime1->diff($datetime2);
echo $interval->format('%R%a days');

你只需要循环你的数组来做你想做的事。

$count = count($arr);
for ($i = 0; $i < $count - 1; $i++) {
    $datetime1 = new DateTime($arr[$i]);
    $datetime2 = new DateTime($arr[$i + 1]);
    $interval = $datetime1->diff($datetime2);
    echo $interval->format('%R%a days');
} 

【讨论】:

  • 数组项的语法是什么,而不是 2 个单独的变量?
  • 我已经根据你的回答更新了我的问题,我仍然需要一点帮助:)
  • @user1064660 在 for 循环之后添加 if ($arr[$i] === $arr[$i+1]) continue; 怎么样。
  • 更新了我的问题,但我仍然得到类似“+2 天+0 天+0 天+0 天”的输出
  • @user1064660 你的值是字符串吗?
【解决方案2】:

像这样?

     foreach($input as $k=>$i){ if(empty($input[$k-1])) continue; echo "<br /> difference between [".($k-1)."] and [".$k."] is ".'"'.round(abs(strtotime($i)-strtotime($input[$k-1]))/(3600*24)).'"'." days "; };

【讨论】:

    【解决方案3】:
    <?php 
        $dates = array(
            '2012-04-04',
            '2012-04-06',
            '2012-04-06',
            '2012-04-06',
            '2012-04-06',
            '2012-04-06',
            '2012-04-06',
            '2012-04-11',
            '2012-04-12',
            '2012-04-12',
            '2012-04-13',
            '2012-04-13',
            '2012-04-13',
            '2012-04-13',
            '2012-04-13',
            '2012-04-13',
            '2012-04-13'
       );
    
       array_walk($dates, function($item, $key) {
            static $previous = null;
            if ($previous != null) {
                $datetime1 = new DateTime($previous);
                $datetime2 = new DateTime($item);
                $interval = $datetime1->diff($datetime2);
                echo $interval->format('%R%a days') . "\n";
            } 
            $previous = $item;
       }); 
    
    ?>   
    

    【讨论】:

    • 我认为我的 PHP 版本不支持该功能,我收到 T_FUNCTION 错误。无论如何我可以绕过它吗?
    • 听起来你不在 PHP 5.3 上,所以你不能传入 lambda。您需要将function($item, $key)... 部分提取到独立函数function processDate($item, $key)... 中。现在,您可以将“processDate”作为第二个参数传递给 array_walk。
    猜你喜欢
    • 2012-10-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-25
    • 2012-02-29
    • 2023-03-31
    • 1970-01-01
    相关资源
    最近更新 更多