台灣最大程式設計社群網站
線上人數
1846
 
會員總數:241132
討論主題:186802
歡迎您免費加入會員
討論區列表 >> PHP >> PHP錯誤提示
[ 變換順序 ]  
[我要回覆]
1
回應主題 加入我的關注話題 檢舉此篇討論 將提問者加入個人黑名單
PHP錯誤提示
價值 : 500 QP  點閱數:169 回應數:14

樓主

迷路
高級專家
9285 124
5913 1570
發送站內信

捐贈 VP 給 迷路
我有一個檢查陣列值是否存在的函數
因為PHP升級導致回報錯誤
PHP Notice: Undefined offset: 15 in /XXX/XXX/XXXX.php on line xx
函數如下

被提示有問題的行數內容為
for($j=0;$j<count($ary[$i]);$j++){

Google後得到的結論是,可能有$ary[$i]不是陣列的情況發生,導致PHP提出警告
所以將原本只檢查是否存在的isset改成isset && is_array,但是相同的錯誤仍然發生
請問原因與如何修正?

搜尋相關Tags的文章: [ Undefined offset ] ,
本篇文章發表於2017-10-25 14:54
別忘捐VP感謝幫助你的人 新手會員瞧一瞧
1樓
回應

迷路
捐贈 VP 給 迷路 檢舉此回應
找到原因了
我真是腦袋抽筋了
再比對到存在資料時用變更$i,$j的方式來中斷兩個迴圈的執行
但是內層迴圈會再回到for一次才跳出,在那次時,$ary[$i]會是不存在的陣列位置
而檢查用的條件式卻無能為力
將中斷迴圈的方式改為break 2;就能正常執行了
本篇文章回覆於2017-10-25 18:49
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
2樓
最有價值解答

可樂快跑
檢舉此回應
我覺得問題是出在……
你打了一個波動拳……
本篇文章回覆於2017-10-27 09:41
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
3樓
不錯的參考

浩瀚星空
捐贈 VP 給 浩瀚星空 檢舉此回應
迷路啊~~~~

有foreach不用。怎麼再用count啊。
本篇文章回覆於2017-10-27 11:25
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
4樓
回應

迷路
捐贈 VP 給 迷路 檢舉此回應
可樂大,波動拳是什麼意思?

星空大,最初是沒有判斷式檢查有無宣告和是否為陣列
用foreach會在非陣列時出現錯誤
所以之前都會偷懶用for+count
本篇文章回覆於2017-10-31 09:17
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
5樓
回應

可樂快跑
檢舉此回應


懂乎?
本篇文章回覆於2017-10-31 09:47
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
6樓
回應

可樂快跑
檢舉此回應
疑?我貼圖失敗了?再一次。
本篇文章回覆於2017-10-31 09:48
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
7樓
回應

浩瀚星空
捐贈 VP 給 浩瀚星空 檢舉此回應
一般會在其 chk($a, $ary=array())或是(array)來做強制宣告

但如果傳入的值會有可能是數值或文字,其實在程式上就會有問題了。
一般來說你這是在function下的東西。真的不因該用count做處理的。
本篇文章回覆於2017-10-31 16:35
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
8樓
回應

迷路
捐贈 VP 給 迷路 檢舉此回應
可樂大,看到圖我就想起來了,之前也有看過文章說這樣寫不好
但是一直沒搞懂原因,畢竟有好好用縮排應該就不會發生沒有結尾或是搞錯範圍的問題
而且像我這樣的情況,難道要把裡面的條件式和迴圈再抽出來寫一個function嗎?

星空大,我一直以為chk($a, $ary=array())這樣的寫法是
當呼叫chk()卻沒有給第二個參數時,會將第二個參數預設為空陣列
難道說這樣寫能強制將第二個參數轉成陣列型態?
另外,我其實不明白for+count和foreach的差別?
如果迴圈會跑上千百次的話,前者會因為重複呼叫count函數較花資源和時間
但是如果只是幾十次的話,兩者應該感覺不到差別吧?
有其它使用foreach的原因嗎?還是說這只是要養成良好的習慣?
本篇文章回覆於2017-11-02 09:20
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
9樓
回應

浩瀚星空
捐贈 VP 給 浩瀚星空 檢舉此回應
不會~~~~給空值還是會跑空值沒錯。
不過一般來說這樣的目的主要就是為了要讓自已知道,那個要是陣列才行。
基本上而言,我並不會讓它傳非陣列的東西進來。
當然有時為了安全起見。我可能會多一個判斷
$arr = $arr ? $arr : array();
不過這樣也只是能將空值轉換。遇到有數值或文字型態的也是會死。
但正常來說,你原本也就不該讓數值或文字型態的值就送過來了。

使用count的確只是效能問題。但就如你說的。影響不大。
但不能因為這樣就去忽視他。
其誤差是0.0001跟0.000000001的差別。
確實10幾次是沒差。但就數學來看,其速度是相差了10000xxx倍
不能因為沒差就不去理會。因為你永遠也不清楚他是會跑幾次。

本篇文章回覆於2017-11-02 12:11
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
10樓
回應

可樂快跑
檢舉此回應
@迷路
你說對了。就是要抽出來。
對於複雜的行為,就應該將他提取出來將事情簡單化。
而且抽出來的東西說不定還可以有效率的重覆使用。
這不是好不好縮排有沒有結尾的問題。
而是這麼做,判斷式就完全複雜化了。
而日後要維護,相對的難度也會變高。
先從一個最簡單的重構來看起吧!


這邊,你的$flag就已經多餘了不是嗎?
本篇文章回覆於2017-11-02 21:23
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
11樓
回應

可樂快跑
檢舉此回應
再來,為了避免複雜的層級,其實可以把條件做個轉換(有時反轉處理條件,就能把你的問題處理的更好)

看看,事情是不是開始往好的方面進行了?
本篇文章回覆於2017-11-02 21:28
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
12樓
回應

可樂快跑
檢舉此回應
再來,foreach就可以上場了


本來呢!我是想抽取每個單元所以先重構看看。
不過重構下來呢………
波動拳的威力因為削減了很多,已經減到我能接受的最大三層。
那就不用提取了。這個函式的功能大致就這樣。
本篇文章回覆於2017-11-02 21:37
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
13樓
回應

迷路
捐贈 VP 給 迷路 檢舉此回應
我大致明白可樂大的意思了
感謝可樂大的指點

星空大可以幫我取消無解答狀態嗎?
本篇文章回覆於2017-11-03 13:36
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
14樓
回應

浩瀚星空
捐贈 VP 給 浩瀚星空 檢舉此回應
已幫你解除無解答的狀態了。

基本上來說,就如可樂說的。
不要再用count跟for來處理陣列了。

真的要善用foreach來處理。

至於值不是陣列就會出錯的問題。就用開頭判斷或是轉換的方式來解決就行了。
雖然說php是弱型態語言。但該有的類型宣告我還是會做處理。
本篇文章回覆於2017-11-03 13:46
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
[ 變換順序 ]   
1

回覆
如要回應,請先登入.