php foreach सरणी में पहला मान नहीं दिखा रहा है

मेरे पास एक सरणी ($ vEvents) निम्नानुसार है:

Array
(
[0] => Array
    (
        [id] => 1174
        [date] => 120411
        [name] => DR. J 'Souled Out' ~ 9pm (No Cover)
        [pubId] => 44
        [price] => 
    )

[1] => Array
    (
        [id] => 1108
        [date] => 120410
        [name] => Verb presents Open Stage ~ 9pm (No Cover)
        [pubId] => 44
        [price] => 
    )

[2] => Array
    (
        [id] => 1104
        [date] => 120409
        [name] => DR. J 'Souled Out' ~ 9pm (No Cover)
        [pubId] => 44
        [price] => 
    )
[currLimit] => 10
[eventsRemaining] => 4

मैं इसे स्क्रीन पर प्रतिबिंबित कर रहा हूं:

reset ($vEvents);
foreach ($vEvents as $key => &$value) {
    if ($key != 'currLimit' && $key != 'eventsRemaining'){ //Makes sure it doesn't print out the limiter value
    $m = substr($value['date'],0,2);
    $d = substr($value['date'],2,2);
    $y = '20'.substr($value['date'],4,2);
    echo date("D", mktime(0, 0, 0, $m, $d, $y)).", ".date("M", mktime(0, 0, 0, $m, $d, $y))." ".$d.", ".$y." - ".$value['name'].'
'; } }

लेकिन मेरे आउटपुट पर, सभी प्रदर्शित सरणी प्रविष्टियों को प्राप्त करने के बजाय, यह पहले को छोड़ देता रहता है ... आउटपुट:

Sat, Dec 04, 2010 - Verb presents Open Stage ~ 9pm (No Cover)
Fri, Dec 04, 2009 - DR. J 'Souled Out' ~ 9pm (No Cover)

हालांकि, मेरा अपेक्षित आउटपुट होना चाहिए:

Sun, Dec 04, 2011 - DR. J 'Souled Out' ~ 9pm (No Cover)
Sat, Dec 04, 2010 - Verb presents Open Stage ~ 9pm (No Cover)
Fri, Dec 04, 2009 - DR. J 'Souled Out' ~ 9pm (No Cover)

मैंने name कुंजी और ऐसे सभी मानों को बदलने की कोशिश की है, लेकिन अन्य सभी संपूर्ण शो ठीक है, यह हमेशा पहली कुंजी को छोड़ देता है। मुझे पहले कभी यह मुद्दा नहीं मिला है। विचार?

When I comment out the:if ($key != 'currLimit' && $key != 'eventsRemaining'){ //Makes sure it doesn't print out the limiter value line, it works fine. Is it relevant that the key of the first element is zero? But why would that fail my if check?

1
जोड़ा संपादित
विचारों: 1
यह नहीं कह रहा कि यह निश्चित रूप से समस्या है, लेकिन क्या आप साझा करना चाहते हैं कि आप अपने लूप वैरिएबल को एम्पर्सेंड के साथ क्यों उपसर्ग कर रहे हैं?
जोड़ा लेखक Brian Warshaw, स्रोत
क्या आपकी संख्यात्मक कुंजी वास्तव में संख्यात्मक हैं या वे तार हैं?
जोड़ा लेखक Brian Warshaw, स्रोत
आपका कोड ठीक दिखता है। क्या आपके print_r() और आपके लूप के बीच कुछ भी हो रहा है? वैसे, आप रीसेट -call को छोड़ सकते हैं क्योंकि इसका कोई प्रभाव नहीं होना चाहिए।
जोड़ा लेखक yankee, स्रोत
@yankee मैंने इस मुद्दे को आजमाने और डीबग करने के लिए reset जोड़ा। आमतौर पर मैं इसे जोड़ नहीं होता।
जोड़ा लेखक MaurerPower, स्रोत
@chris वहाँ एक पंक्ति है जिसका मैं उपयोग कर रहा था, लेकिन मुझे नहीं लगता कि यह कैसे प्रभावित करेगा ... कृपया अद्यतन प्रश्न देखें
जोड़ा लेखक MaurerPower, स्रोत
आपके द्वारा पोस्ट किया गया कोड और सरणी सामग्री सही ढंग से निष्पादित कोड और सरणी सामग्री का प्रतिनिधित्व नहीं करती है। आपके द्वारा पोस्ट की गई एक नई नई पूरी तरह से अलग लिपि में कोड और सरणी चलाएं, और आप देखेंगे कि यह काम करता है।
जोड़ा लेखक goat, स्रोत
लूप के अंदर मूल्य डीबग करने का प्रयास करें
जोड़ा लेखक Moyed Ansari, स्रोत

2 उत्तर

चूंकि यह एक सरणी है, इसलिए मैं एक अलग प्रकार के लूप का उपयोग करने की कोशिश करता हूं जो आपको अपेक्षित परिणाम देना चाहिए:

<?php

$length = count( $vEvents );

for( $i = 0; $i < $length; i ++ )
{

$key = $i;
$value = $vEvents[ $i ];

//rest of the loop code here

}
?>
3
जोड़ा
@SteveBinder: यह सच नहीं है क्योंकि आप सहयोगी सरणी के लिए foreach का उपयोग कर सकते हैं: foreach ($ array = $ value के रूप में $ array)
जोड़ा लेखक xbonez, स्रोत
foreach विशेष रूप से सरणी के लिए एक abstraction है, लेकिन सरणी के लिए उपयुक्त है। फोरैच का उपयोग करना बिल्कुल ठीक है क्योंकि मुझे इसे कोड पठनीयता के अतिरिक्त के रूप में माना जाता है।
जोड़ा लेखक yankee, स्रोत
मेरी समझ है कि foreach पाश विशेष रूप से पहले तत्व से शुरू, और अंतिम अंत में समाप्त, एक सरणी के माध्यम से पुनरावृत्ति के लिए प्रयोग किया जाता है
जोड़ा लेखक MaurerPower, स्रोत
समस्या यह है कि इस समस्या का निवारण करने के बाद मुझे दो कुंजियां हैं जिन्हें बाद में लूप में एक्सेस करने की आवश्यकता होगी। वे सहयोगी हैं। इस प्रकार मैं एक foreach का उपयोग करने की कोशिश क्यों कर रहा हूँ।
जोड़ा लेखक MaurerPower, स्रोत
foreach सबसे अच्छा है जब आप किसी ऑब्जेक्ट की चाबियाँ/इंडेक्स नहीं जानते हैं, जबकि लूप के लिए अनुक्रमित सरणी के लिए बेहतर है।
जोड़ा लेखक Steve Binder, स्रोत
हालांकि यहां सवाल यह है कि "0" इंडेक्स को छोड़ने का प्रस्ताव क्यों है, इसलिए मैंने लूप के लिए सिफारिश की है।
जोड़ा लेखक Steve Binder, स्रोत

PHP अजीब है जब यह 0 के मानों से संबंधित है ... यह ज्यादातर मामलों में उन्हें झूठा मानता है। इसलिए,

if ($key != 'currLimit' && $key != 'eventsRemaining')

झूठ का मूल्यांकन करने जा रहा है जब $ key == 0. मैं इसे बदल दूंगा:

if ($key !== 'currLimit' && $key !== 'eventsRemaining')
2
जोड़ा
उत्तम!!! जबकि मुझे पता है कि 0 PHP में झूठ के बराबर है, मुझे नहीं पता था कि इस प्रकार के वाक्यविन्यास के साथ प्रभावी होगा। सख्त तुलना का उपयोग महान काम किया, धन्यवाद !!!
जोड़ा लेखक MaurerPower, स्रोत
एक बार फिर धन्यवाद! यही कारण है कि मैं एसओ प्यार करता हूँ। आपके जैसे उपयोगकर्ता जो न केवल उत्कृष्ट उत्तर प्रदान करते हैं, बल्कि यह भी स्पष्ट स्पष्टीकरण देते हैं कि क्यों। इस तरह हम सभी सीखते हैं :)
जोड़ा लेखक MaurerPower, स्रोत
थोड़ा खोदने और पता चला कि $ कुंजी एक पूर्णांक मान है, PHP एक curger 'currLimit' को एक पूर्णांक में परिवर्तित करता है ... जो 0 का मूल्यांकन करता है। तो 0! = 0 गलत है।
जोड़ा लेखक bobwienholt, स्रोत