2011-06-09 39 views
5

(看起來我的環境/系統出了問題,我現在正在分析它,每個邏輯答案都被嘗試過了,失敗了,所以一旦我有更多的分享,就會報告回來。感謝您的回答!)PHP中的基本整數劃分失敗 - 很難

我已經寫了一些簡單的PHP代碼來計算兩個日期之間的持續時間,並做一些基本的算術運算,來計算一些百分比值。

我對此失效的線索感到失望!在我看來,一個變量在一行上被視爲一個整數,在另一行上被視爲一個字符串。

$start_DT = new DateTime($startdate); // e.g. 2011-06-07 
$end_DT = new DateTime($enddate); // e.g. 2011-06-14 
$today_DT = new DateTime("now");  // 2011-06-09 

$duration  = date_diff($end_DT, $start_DT)->d; 
$days_remaining = date_diff($end_DT, $today_DT)->d; 

echo $days_remaining; // This outputs a value of "4" in my specific case 
echo $duration;  // This outputs a value of "7" for my specific case. 

$percentage_dur_complete = $days_remaining/$duration; 

echo $percentage_dur_complete; // This gives a value of NAN 

// This line says that I am dividing my zero, to imply that 
// $duration might be a string. 
$percentage_dur_complete = $days_remaining/(float) $duration; 

我是否缺少一些基本的東西?我是PHP的相對新手(2個月)。我真的希望(有可能看起來很愚蠢),我錯過了一些東西。

謝謝!

+1

在除法之前檢查每個變量的類型的一種方法是使用'var_dump($ myvar)',它會告訴你'$ myvar'的類型和值。更多信息在這裏:http://php.net/manual/en/function.var-dump.php – n00dle 2011-06-09 21:59:34

+0

如果我做'var_dump',那麼這兩個數字都是整數,'$ percentage_dur_complete'包含一個合適的數字。一定還有其他的錯誤。你確定'$ startdate'和'$ enddate'設置正確嗎? – 2011-06-09 22:02:52

+0

爲了進行完整性檢查,您運行的是哪個版本的PHP? – 2011-06-09 22:05:25

回答

2

嘗試

$percentage_dur_complete = (int)$days_remaining/(int)$duration; 

編輯: 這對我的作品......

<?php 
$startdate = '2011-06-05'; 
$enddate = '2011-06-12'; 
$today_DT = new DateTime("now"); 
$start_DT = new DateTime($startdate); // e.g. 2011-06-07 
$end_DT = new DateTime($enddate); 
$duration  = date_diff($end_DT, $start_DT)->d; 
$days_remaining = date_diff($end_DT, $today_DT)->d; 
var_dump ($duration); 
var_dump ($days_remaining); 
$percentage_dur_complete = $days_remaining/$duration *100; 
echo ($percentage_dur_complete); 
?> 

如果它不適合你,這是最肯定的問題與你的PHP安裝/版本!

+0

我也試過了。試了一遍,仍然給我南 – 2011-06-09 22:01:58

+0

睡眠不起作用,但我想知道爲什麼它是有道理的補充?似乎有點不相關? – 2011-06-09 22:32:53

+0

只是一個預感...... D – 2011-06-09 22:33:56

0

我把你的代碼,並修改了一點(格式化輸出,但更重要的是通過直接串入DateTime功能):

$start_DT = new DateTime('2011-06-07'); 

$end_DT = new DateTime('2011-06-14'); 

$today_DT = new DateTime("now"); 

$duration = date_diff($end_DT, $start_DT)->d; 

$days_remaining = date_diff($end_DT, $today_DT)->d; 

echo $days_remaining . "<br>"; 

echo $duration . "<br>"; 

$percentage_dur_complete = $days_remaining/$duration; 

echo $percentage_dur_complete . "<br>"; 

$percentage_dur_complete = $days_remaining/(float) $duration; 

echo $percentage_dur_complete . "<br>"; 

而且我得到的輸出看起來像這樣:

5 
7 
0.71428571428571 
0.71428571428571 

我的預感是,你沒有通過你認爲你通過生成$start_DT$end_DT

+0

我試過了。什麼更奇怪(呃)是每個其他操作與$持續時間失敗,並且其他所有工作。 所以,如果我爲$ duration添加額外的回聲,我自己的代碼工作正常。想不通爲什麼 – 2011-06-09 22:07:02

+0

我不確定你的意思?你是說它在工作和不工作之間交替? – 2011-06-09 22:08:17

+0

所以,如果我複製粘貼代碼按,這是我得到: NAN 0.42857142857143 – 2011-06-09 22:08:44

0

我敢打賭,DateTime的構造函數在傳入日期時遇到了問題。試試這個:

$startdate = "2011-06-07"; 
$enddate = "2011-06-14"; 

$start_DT = DateTime::createFromFormat('Y-m-j',$startdate); 
$end_DT = DateTime::createFromFormat('Y-m-j',$enddate); 
$today_DT = new DateTime("now"); 

$duration = date_diff($end_DT, $start_DT)->d; 
$days_remaining = date_diff($end_DT, $today_DT)->d; 

echo $days_remaining . "<br>\n"; 
echo $duration . "<br>\n"; 

$percentage_dur_complete = $days_remaining/$duration; 
echo $percentage_dur_complete . "<br>\n"; 

$percentage_dur_complete = $days_remaining/(float) $duration; 
echo $percentage_dur_complete . "<br>\n"; 

確保格式字符串匹配你如何在你的日期字符串傳遞(即「J」天與領先的零,「d」幾天都沒有)。

+0

謝謝。這工作了一下,然後停止工作。我認爲我的安裝有問題。將重新安裝所有/在不同的系統上嘗試它。即使我按照原樣使用代碼,它也會間歇性地工作。讓我相信它的我的系統 – 2011-06-09 23:57:37

0

我有同樣的問題。我使用的是PHP 5.3.1,我升級到5.4.17來解決這個問題。不要浪費時間試圖尋找像我最初那樣的解決方法。

+0

是真正與date_diff問題相關的答案,這個問題暴露在問題中? – emecas 2013-04-10 14:28:04