iT邦幫忙

0

【請問陣列比對找值 ???】

  • 分享至 

  • xImage

我有三個陣列,分別為
$a = array('443563','443577','443270','443226','443334','443561','443322','443495')
$start =
array('2012/7/12','2012/7/13','2012/7/14','2012/7/16','2012/7/16','2012/7/17','2012/7/18','2012/7/18')
$end =
array('2012/7/15','2012/7/18','2012/7/14','2012/7/16','2012/7/21','2012/7/17','2012/7/18','2012/7/18')

以今天 2012/7/13 來說
我希望找出 符合 三天內(含今天)的號碼
所以日期區間應該
7/13-7/16 都符合條件
結果應該只有
443563
443577
443270
443226
443334
符合
請問程式碼要怎麼寫比較好呢??

圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

2 個回答

4
wiseguy
iT邦超人 1 級 ‧ 2012-07-13 11:19:48
最佳解答

你沒寫你的判斷邏輯是什麼,人家會把你說的7/13-7/16 都符合條件套用在 $start 與 $end 之間,因為你有列出這兩個陣列,於是得出只有
443270
443226
這 2 筆符合。因為會這樣寫:

<pre class="c" name="code"><?php
$a = array('443563','443577','443270','443226','443334','443561','443322','443495');
$start = array('2012/7/12','2012/7/13','2012/7/14','2012/7/16','2012/7/16','2012/7/17','2012/7/18','2012/7/18');
$end = array('2012/7/15','2012/7/18','2012/7/14','2012/7/16','2012/7/21','2012/7/17','2012/7/18','2012/7/18');
$today = strtotime('today');
$after3day = strtotime('today +3 day');
foreach ($a as $i => $key)
	if (strtotime($start[$i]) >=$today && strtotime($end[$i]) <= $after3day)
		echo $key, "\n";
?>

但是看到你的答案, 似乎只看 $start 而已。於是只判斷 $start:

<pre class="c" name="code"><?php
$a = array('443563','443577','443270','443226','443334','443561','443322','443495');
$start = array('2012/7/12','2012/7/13','2012/7/14','2012/7/16','2012/7/16','2012/7/17','2012/7/18','2012/7/18');
$end = array('2012/7/15','2012/7/18','2012/7/14','2012/7/16','2012/7/21','2012/7/17','2012/7/18','2012/7/18');
$today = strtotime('today');
$after3day = strtotime('today +3 day');
foreach ($a as $i => $key)
	if (strtotime($start[$i]) >=$today && strtotime($start[$i]) <= $after3day)
		echo $key, "\n";
?>

又得出只有
443577
443270
443226
443334
這 4 筆資料,怎麼都得不到 5 筆,到底是你敘述錯誤?還是答案錯誤?或是我誤會什麼了?

wiseguy iT邦超人 1 級 ‧ 2012-07-13 12:02:38 檢舉

如果是 start 與 end 各別判斷,就會出現 5 個答案:

<pre class="c" name="code">  if ((strtotime($start[$i]) >= $today && strtotime($start[$i]) <= $after3day) ||
      (strtotime($end[$i])   >= $today && strtotime($end[$i])   <= $after3day))
4
slime
iT邦大師 1 級 ‧ 2012-07-13 11:43:55

看起來有點像生產批號或叫貨進出貨時間, 把欄跟行交換一下:

a start end (是否符合 7/13-7/16)
443563 7/12 7/15 y
443577 7/13 7/18 y
443270 7/14 7/14 y
443226 7/16 7/16 y
443334 7/16 7/21 y
443561 7/17 7/17 n
443322 7/18 7/18 n
443495 7/18 7/18 n

這題型考的是"兩組時間的判斷", 所以請自己劃出幾個時間軸: (註: 為了避免照抄, 某些條件我故意刪除.)

  1. 基準時間軸: 7/13~7/16
  2. 判斷時間軸: start < 7/13 , end < 7/13 (不成立)
  3. 判斷時間軸: start < 7/13 , end >= 7/13 (成立)
  4. 判斷時間軸: start between 7/13 .... (成立)
  5. 判斷時間軸: start > 7/16 , .... (不成立)

就可以寫出幾種判斷式, 再考慮簡化: (對了, 到底用哪種語言寫啊? 我用自編語言好了 XD )
if ( start <= end and not ( end < 7/13 and start > 7/16 ) )

這樣挑出來
443563 7/12 7/15 y
443577 7/13 7/18 y
443270 7/14 7/14 y
443226 7/16 7/16 y
443334 7/16 7/21 y
這五筆.

slime iT邦大師 1 級 ‧ 2012-07-17 08:26:38 檢舉

語法修正:

&lt;pre class="c" name="code">if ( start &lt;= end and not ( end &lt; 7/13 OR start > 7/16 ) )

我要發表回答

立即登入回答