2011-05-23 14 views
50

कृपया मेरी मदद करो वास्तविक php कोड को यह छद्म कोड का अनुवाद करने में है:, सरणी यात्रा के दौरान जांच की जा रही है, तो वर्तमान तत्व पिछले तत्व

foreach ($arr as $k => $v) 
    if (THIS IS NOT THE LAST ELEMENT IN THE ARRAY) 
     doSomething(); 

संपादित करें: सरणी हो सकता है संख्यात्मक या स्ट्रिंग कुंजी

+5

'गिनती ($ arr) - 1' पुनरावृत्तियों के लिए 'लूप' का उपयोग क्यों न करें? – Marcin

+0

यदि आपके पास मिश्रित कुंजी है, तो आप कैसे निर्धारित करते हैं कि आखिरी वस्तु कौन सी कुंजी है? यदि आप इसे सरणी में जोड़े गए अंतिम आइटम के रूप में चाहते हैं, तो टाइम स्टैंप को इंगित करने के लिए कुछ डेटा होना चाहिए। – Rasika

+0

अंतिम के लिए परिभाषा: सरणी के आंतरिक क्रम से।जो कि आखिरी तत्व कहने के समान है कि फ़ोरैच लूप – shealtiel

उत्तर

88

आप PHP के end()

$array = array('a' => 1,'b' => 2,'c' => 3); 
$lastElement = end($array); 
foreach($array as $k => $v) { 
    echo $v . '<br/>'; 
    if($v == $lastElement) { 
     // 'you can do something here as this condition states it just entered last element of an array'; 
    } 
} 

Update1

01 उपयोग कर सकते हैं

जैसा कि उपरोक्त @ मिजोजा द्वारा इंगित किया गया है, यदि आपके पास सरणी में कई बार समान मूल्य है तो समस्या हो सकती है। नीचे इसके लिए तय है।

$array = array('a' => 1, 'b' => 2, 'c' => 3, 'd' => 2); 
//point to end of the array 
end($array); 
//fetch key of the last element of the array. 
$lastElementKey = key($array); 
//iterate the array 
foreach($array as $k => $v) { 
    if($k == $lastElementKey) { 
     //during array iteration this condition states the last element. 
    } 
} 

Update2

मैं बेहतर तो मैं क्या जवाब दे दिया है, क्योंकि यह आंतरिक सूचक सरणियों संशोधित नहीं करता है हो सकता है, मैं इस सवाल का जवाब अपने जवाब से मिलान करने के अद्यतन करने हूँ @onteria_ से समाधान मिल गया।

$array = array('a' => 1, 'b' => 2, 'c' => 3, 'd' => 2); 
// Get array keys 
$arrayKeys = array_keys($array); 
// Fetch last array key 
$lastArrayKey = array_pop($arrayKeys); 
//iterate array 
foreach($array as $k => $v) { 
    if($k == $lastArrayKey) { 
     //during array iteration this condition states the last element. 
    } 
} 

आप array_keys द्वारा बनाई गई अस्थायी सरणी पर

+9

चुनता है यदि आपके पास सरणी – Mijoja

+2

में एक ही मान एकाधिक बार है तो आपको संकेत देने के लिए @ मिजोजा धन्यवाद। कोड अपडेट किया गया :) –

11
$myarray = array(
    'test1' => 'foo', 
    'test2' => 'bar', 
    'test3' => 'baz', 
    'test4' => 'waldo' 
); 

$myarray2 = array(
'foo', 
'bar', 
'baz', 
'waldo' 
); 

// Get the last array_key 
$last = array_pop(array_keys($myarray)); 
foreach($myarray as $key => $value) { 
    if($key != $last) { 
    echo "$key -> $value\n"; 
    } 
} 

// Get the last array_key 
$last = array_pop(array_keys($myarray2)); 
foreach($myarray2 as $key => $value) { 
    if($key != $last) { 
    echo "$key -> $value\n"; 
    } 
} 

array_pop के बाद से काम करता है @onteria_ यह बिल्कुल मूल सरणी संशोधित नहीं करता है धन्यवाद।

$ php test.php 
test1 -> foo 
test2 -> bar 
test3 -> baz 
0 -> foo 
1 -> bar 
2 -> baz 
+0

मुझे स्वीकार्य उत्तर से यह बेहतर पसंद है क्योंकि इसे केवल लूप के बाहर प्रारंभ करने के लिए एक पंक्ति की आवश्यकता है। –

+0

मुझे यह स्वीकार्य उत्तर से बेहतर पसंद है क्योंकि यह उस सरणी के आंतरिक सूचक को परिवर्तित नहीं करता है जिसे आप लूप करने वाले हैं। – autonymous

+0

पहले तत्व '$ first = array_shift (array_keys ($ myarray2)) के लिए ऐसा करने के लिए; ' – Luke

0

आइटम संख्यानुसार आदेश दिया रहे हैं, तो वर्तमान आइटम के सूचकांक का निर्धारण और लंबाई की तुलना करने के लिए महत्वपूर्ण() फ़ंक्शन का उपयोग करें।

$length = sizeOf($arr); 
while (key(current($arr)) != $length-1) { 
    $v = current($arr); doSomething($v); //do something if not the last item 
    next($myArray); //set pointer to next item 
} 
+0

क्योंकि जब पहली बार मैंने गुस्से में पाया तो यह पहली बात है। एक ही चीज करने के लिए सभी अलग-अलग तरीकों को जानना और बेहतर ज्ञान होना अच्छा होता है। : डी – trusktr

+1

गैर संख्यात्मक, या अन्यथा गैर कड़ाई से आदेशित वस्तुओं के लिए काम नहीं करेगा – shealtiel

+0

आह, सच है। यह बात बताने के लिए धन्यवाद! – trusktr

0
$arr = array(1, 'a', 3, 4 => 1, 'b' => 1); 
foreach ($arr as $key => $val) { 
    echo "{$key} = {$val}" . (end(array_keys($arr))===$key ? '' : ', '); 
} 
// output: 0 = 1, 1 = a, 2 = 3, 4 = 1, b = 1 
14

यह हमेशा करता है मेरे लिए चाल

foreach($array as $key => $value) { 
    if (end(array_keys($array)) == $key) 
     // Last key reached 
} 
: आप चक्र के बगल में() या पिछले() आइटम के माध्यम से लूप के लिए एक के बजाय थोड़ी देर के पाश में उपयोग करने के लिए होगा

संपादित 30/04/15

$last_key = end(array_keys($array)); 
reset($array); 

foreach($array as $key => $value) { 
    if ($key == $last_key) 
     // Last key reached 
} 

E_STRICT चेतावनी @Warren सर्जेंट द्वारा

उल्लेख से बचने के लिए 0
$array_keys = array_keys($array); 
$last_key = end($array_keys); 
+0

अधिक सुरुचिपूर्ण और आसान! :) –

+0

मुझे यकीन नहीं है कि यह टिप्पणी स्वीकृत उत्तर क्यों नहीं है। यह संभावित उपयोग मामलों (यानी सहयोगी ** और ** समेकित सरणी) के विशाल बहुमत के लिए सभी प्रदत्त उत्तरों और कार्यों का सबसे सरल/साफ है। – Pierce

+1

@Pierce आपको एक संकेत देने के लिए: स्वीकृत उत्तर के साढ़े सालों बाद इसका उत्तर दिया गया था, इसके अलावा यदि आपके सरणी में 1000 आइटम हैं, तो आप 1000 बार "end" और "array_keys" 1000 बार कॉल करेंगे। – StefanNch

1

मेरे समाधान, यह भी काफी सरल ..

$array = [...]; 
$last = count($array) - 1; 

foreach($array as $index => $value) 
{ 
    if($index == $last) 
     // this is last array 
    else 
     // this is not last array 
} 
1

मैं यहाँ एक और समाधान जानते हैं कि यह पुराना है, और हो सकता है सिर्फ एक overkill एसपीएल इटरेटर का उपयोग कर, लेकिन वैसे भी,:

$ary = array(1, 2, 3, 4, 'last'); 
$ary = new ArrayIterator($ary); 
$ary = new CachingIterator($ary); 
foreach ($ary as $each) { 
    if (!$ary->hasNext()) { // we chain ArrayIterator and CachingIterator 
          // just to use this `hasNext()` method to see 
          // if this is the last element 
     echo $each; 
    } 
} 
0

यह बहुत आसान तरीका क्यों नहीं:

$i = 0; //a counter to track which element we are at 
foreach($array as $index => $value) { 
    $i++; 
    if($i == sizeof($array)){ 
     //we are at the last element of the array 
    } 
} 
संबंधित मुद्दे