जवाबों:
आप एक काउंटर का उपयोग कर सकते हैं:
$i = 0;
$len = count($array);
foreach ($array as $item) {
if ($i == 0) {
// first
} else if ($i == $len - 1) {
// last
}
// …
$i++;
}
$i = 1
, तो आपको चिंता करने की जरूरत नहीं है $len - 1
, बस उपयोग करें $len
।
यदि आप एक ऐसे समाधान को पसंद करते हैं जिसमें लूप के बाहर काउंटर के आरंभीकरण की आवश्यकता नहीं है, तो मैं उस फ़ंक्शन के खिलाफ वर्तमान पुनरावृत्ति कुंजी की तुलना करने का प्रस्ताव करता हूं जो आपको सरणी की अंतिम / पहली कुंजी बताता है।
यह आगामी PHP 7.3 के साथ कुछ अधिक कुशल (और अधिक पठनीय) हो जाता है।
foreach($array as $key => $element) {
if ($key === array_key_first($array))
echo 'FIRST ELEMENT!';
if ($key === array_key_last($array))
echo 'LAST ELEMENT!';
}
foreach($array as $key => $element) {
reset($array);
if ($key === key($array))
echo 'FIRST ELEMENT!';
end($array);
if ($key === key($array))
echo 'LAST ELEMENT!';
}
end()
+ है key()
- यदि यह दोनों है तो यह है कि हर बार 4 तरीके कहे जा रहे हैं। दी, वे बहुत हल्के ऑपरेशन होंगे और शायद सिर्फ पॉइंटर लुकअप हैं, लेकिन फिर डॉक्स यह निर्दिष्ट करने के लिए आगे बढ़ते हैं reset()
और सरणी के आंतरिक पॉइंटर को end()
संशोधित करते हैं - तो क्या यह काउंटर की तुलना में तेज है? शायद नहीं।
reset()
तो फोर्क से पहले कॉल को स्थानांतरित करने और परिणाम को कैश करने के लिए स्वतंत्र महसूस करें $first
।
अंतिम आइटम खोजने के लिए, मुझे हर बार कोड का यह टुकड़ा काम आता है:
foreach( $items as $item ) {
if( !next( $items ) ) {
echo 'Last Item';
}
}
[true,true,false,true]
। लेकिन व्यक्तिगत रूप से मैं इस का उपयोग कर रहा हूँ कभी भी मैं एक सरणी के साथ काम कर रहा हूँ जिसमें बूलियन शामिल नहीं है false
।
next()
कभी भी फ़ॉरच लूप के अंदर इस्तेमाल नहीं किया जाना चाहिए । यह आंतरिक सरणी पॉइंटर को मैसेज करता है। अधिक जानकारी के लिए दस्तावेज़ देखें।
उपरोक्त और अधिक सरलीकृत संस्करण जो आप कस्टम अनुक्रमित का उपयोग नहीं कर रहे हैं ...
$len = count($array);
foreach ($array as $index => $item) {
if ($index == 0) {
// first
} else if ($index == $len - 1) {
// last
}
}
संस्करण 2 - क्योंकि मैं आवश्यक होने तक दूसरे का उपयोग करके घृणा करने आया हूं।
$len = count($array);
foreach ($array as $index => $item) {
if ($index == 0) {
// first
// do something
continue;
}
if ($index == $len - 1) {
// last
// do something
continue;
}
}
if ($index == count($array) - 1)
। देखें यहाँ ।
आप सरणी से पहले और अंतिम तत्वों को निकाल सकते हैं और उन्हें अलग से संसाधित कर सकते हैं।
ऐशे ही:
<?php
$array = something();
$first = array_shift($array);
$last = array_pop($array);
// do something with $first
foreach ($array as $item) {
// do something with $item
}
// do something with $last
?>
इनलाइन टैग के बजाय CSS के सभी फॉर्मेटिंग को हटाने से आपके कोड में सुधार होगा और लोड समय में तेजी आएगी।
जब भी संभव हो आप HTML को php लॉजिक के साथ मिलाने से बच सकते हैं।
इस तरह की चीजों को अलग करके आपके पृष्ठ को और अधिक पठनीय और बनाए रखा जा सकता है:
<?php
function create_menu($params) {
//retrieve menu items
//get collection
$collection = get('xxcollection') ;
foreach($collection as $c) show_collection($c);
}
function show_subcat($val) {
?>
<div class="sub_node" style="display:none">
<img src="../images/dtree/join.gif" align="absmiddle" style="padding-left:2px;" />
<a id="'.$val['xsubcatid'].'" href="javascript:void(0)" onclick="getProduct(this , event)" class="sub_node_links" >
<?php echo $val['xsubcatname']; ?>
</a>
</div>
<?php
}
function show_cat($item) {
?>
<div class="node" >
<img src="../images/dtree/plus.gif" align="absmiddle" class="node_item" id="plus" />
<img src="../images/dtree/folder.gif" align="absmiddle" id="folder">
<?php echo $item['xcatname']; ?>
<?php
$subcat = get_where('xxsubcategory' , array('xcatid'=>$item['xcatid'])) ;
foreach($subcat as $val) show_subcat($val);
?>
</div>
<?php
}
function show_collection($c) {
?>
<div class="parent" style="direction:rtl">
<img src="../images/dtree/minus.gif" align="absmiddle" class="parent_item" id="minus" />
<img src="../images/dtree/base.gif" align="absmiddle" id="base">
<?php echo $c['xcollectionname']; ?>
<?php
//get categories
$cat = get_where('xxcategory' , array('xcollectionid'=>$c['xcollectionid']));
foreach($cat as $item) show_cat($item);
?>
</div>
<?php
}
?>
पहले खोजने का प्रयास होगा:
$first = true;
foreach ( $obj as $value )
{
if ( $first )
{
// do something
$first = false; //in order not to get into the if statement for the next loops
}
else
{
// do something else for all loops except the first
}
}
बस यह काम करता है!
// Set the array pointer to the last key
end($array);
// Store the last key
$lastkey = key($array);
foreach($array as $key => $element) {
....do array stuff
if ($lastkey === key($array))
echo 'THE LAST ELEMENT! '.$array[$lastkey];
}
अंत मुद्दे को सुलझाने के लिए @billynoah को धन्यवाद ।
if ($key === $lastkey)
।
if ($lastkey === $key)
?
PHP Warning: key() expects parameter 1 to be array, integer given in php shell code on line 1
key()
पूर्णांक मिल रहा है, नहीं end()
। end()
" अंतिम तत्व का मान देता है ", और key()
इनपुट के रूप में एक सरणी की अपेक्षा करता है।
1: एक साधारण for
कथन का उपयोग क्यों न करें ? मान लें कि आप एक वास्तविक सरणी का उपयोग कर रहे हैं और Iterator
आप आसानी से जांच सकते हैं कि काउंटर चर 0 है या तत्वों की पूरी संख्या से कम है। मेरी राय में यह सबसे साफ और समझने योग्य उपाय है ...
$array = array( ... );
$count = count( $array );
for ( $i = 0; $i < $count; $i++ )
{
$current = $array[ $i ];
if ( $i == 0 )
{
// process first element
}
if ( $i == $count - 1 )
{
// process last element
}
}
2: आपको अपनी ट्री संरचना को संग्रहीत करने के लिए नेस्टेड सेट का उपयोग करने पर विचार करना चाहिए । इसके अतिरिक्त आप पुनरावर्ती कार्यों का उपयोग करके पूरी बात को सुधार सकते हैं।
for
से आप पाश कर सकते हैं 1
करने के लिए n-1
और ले if
शरीर से बाहर है। बार-बार उन्हें चेक करने का कोई मतलब नहीं।
सबसे बढ़िया उत्तर:
$arr = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10);
foreach ($arr as $a) {
// This is the line that does the checking
if (!each($arr)) echo "End!\n";
echo $a."\n";
}
@Morg से सबसे कुशल जवाब , इसके विपरीत foreach
, केवल उचित सरणियों के लिए काम करता है, हैश मैप ऑब्जेक्ट नहीं। यह उत्तर लूप के प्रत्येक पुनरावृत्ति के लिए एक सशर्त विवरण के ओवरहेड से बचा जाता है, क्योंकि इनमें से अधिकांश उत्तर (स्वीकृत उत्तर सहित) विशेष रूप से पहले और अंतिम तत्व को संभालकर, और मध्य तत्वों पर लूपिंग करते हैं।
array_keys
समारोह की तरह कुशल जवाब काम करने के लिए इस्तेमाल किया जा सकता foreach
:
$keys = array_keys($arr);
$numItems = count($keys);
$i=0;
$firstItem=$arr[$keys[0]];
# Special handling of the first item goes here
$i++;
while($i<$numItems-1){
$item=$arr[$keys[$i]];
# Handling of regular items
$i++;
}
$lastItem=$arr[$keys[$i]];
# Special handling of the last item goes here
$i++;
मैंने इस पर बेंचमार्किंग नहीं की है, लेकिन लूप में कोई तर्क नहीं जोड़ा गया है, जो प्रदर्शन के लिए सबसे बड़ी हिट हैं, इसलिए मुझे संदेह होगा कि कुशल जवाब के साथ प्रदान किए गए बेंचमार्क बहुत करीब हैं।
यदि आप इस तरह की चीज को फंक्शनल करना चाहते हैं , तो मैंने इस तरह के एक इटैलिएलिस्ट फंक्शन में स्विंग लिया है । हालाँकि, यदि आप दक्षता के बारे में सुपर चिंतित हैं, तो आप जिस्ट कोड को बेंचमार्क करना चाह सकते हैं। मुझे यकीन नहीं है कि सभी फ़ंक्शन इनवोकेशन का परिचय कितना ओवरहेड है।
SQL क्वेरी स्क्रिप्ट बनाने के लिए, या ऐसी कोई भी चीज़ जो पहले या अंतिम तत्वों के लिए अलग-अलग क्रिया करती है, यह बहुत अधिक तेज़ (लगभग दो बार तेज़) है, जो कि अस्वाभाविक चर जाँच से बचने के लिए है।
वर्तमान स्वीकृत समाधान एक लूप और लूप के भीतर एक चेक का उपयोग करता है जिसे हर_सिंगल_टिरियन बनाया जाएगा, ऐसा करने का सही (तेज़) तरीका निम्नलिखित है:
$numItems = count($arr);
$i=0;
$firstitem=$arr[0];
$i++;
while($i<$numItems-1){
$some_item=$arr[$i];
$i++;
}
$last_item=$arr[$i];
$i++;
थोड़ा घर का बना बेंचमार्क निम्नलिखित दिखाया गया है:
टेस्ट 1: मॉडल मॉर्ग के 100000 रन
समय: 1869.3430423737 मिलीसेकंड
test2: यदि अंतिम हो तो मॉडल के 100000 रन
समय: 3235.6359958649 मिलीसेकंड
और इस प्रकार यह बिल्कुल स्पष्ट है कि चेक की लागत बहुत अधिक है, और निश्चित रूप से यह और भी बदतर हो जाता है जितना अधिक चर चेक आप जोड़ते हैं;)
$arr = array('one' => "1 1 1", 4 => 'Four', 1 => 'One'); $numItems = count($arr); $i=0; $firstitem=$arr[0]; echo $i . ': ' . $firstitem . ", "; $i++; while($i<$numItems-1){ $some_item=$arr[$i]; echo $i . ': ' . $some_item . ", "; $i++; } $last_item=$arr[$i]; echo $i . ': ' . $last_item . ", "; $i++;
उत्पादन होगा:0: , 1: One, 2: ,
array()
बनाया गया है, {'one':"1 1 1",0:"",1:"One",2:"",3:"",4:"Four"}
लेकिन खाली तत्वों को गिनती के साथ अनदेखा किया जाता है, आप परिभाषित "चीजों" की संख्या की गिनती कर रहे हैं !! बाउंटी सैक्रीज़ की स्थापना! यह उत्तर इनाम योग्य है, लेकिन अगर @Morg। चला गया, यह व्यर्थ है। मैं एक ऐसे व्यक्ति को इनाम दूंगा जो शायद एसओ का फिर से इस्तेमाल नहीं करेगा! यदि वह वापस आता है और अपने जवाब में सुधार करता है, तो वह इनाम का हकदार है!
array_keys
फ़ंक्शन के साथ हैश के गुण प्राप्त कर सकते हैं , जिसे आप एक सरणी की तरह मान सकते हैं । मेरा "बेहतर" उत्तर देखें ।
$querySet = ""; foreach ($fieldSet as $key=>$value) { $value = $db->dbLink->quote($value); $querySet .= "$key = $value, "; } $querySet = substr_replace($querySet, "", -2); $queryString = "UPDATE users SET $querySet WHERE user_ID = '$user_ID'";
कुंजी और मान के साथ यह काम करता है:
foreach ($array as $key => $value) {
if ($value === end($array)) {
echo "LAST ELEMENT!";
}
}
बूलियन चर का उपयोग करना अभी भी सबसे विश्वसनीय है, भले ही आप पहली उपस्थिति की जांच करना चाहते हों $value
(मुझे यह मेरी स्थिति में और कई स्थितियों में अधिक उपयोगी लगा) , जैसे कि:
$is_first = true;
foreach( $array as $value ) {
switch ( $value ) {
case 'match':
echo 'appeared';
if ( $is_first ) {
echo 'first appearance';
$is_first = false;
}
break;
}
}
if( !next( $array ) ) {
echo 'last value';
}
}
फिर !next( $array )
अंतिम को कैसे खोजेंगे $value
जो true
यदि नहीं है तो वापस आ जाएगीnext()
पुनरावृत्ति के लिए मूल्य ।
और मैं for
इसके बजाय एक लूप का उपयोग करना पसंद करता foreach
हूं अगर मैं इस तरह से एक काउंटर का उपयोग करने जा रहा हूं:
$len = count( $array );
for ( $i = 0; $i < $len; $i++ ) {
$value = $array[$i];
if ($i === 0) {
// first
} elseif ( $i === $len - 1 ) {
// last
}
// …
$i++;
}
जब मैं एक ही समस्या है मैं इस धागे में आया था। मुझे केवल पहला तत्व प्राप्त करने की आवश्यकता है फिर मैं अपने कोड का फिर से विश्लेषण करता हूं जब तक कि यह मेरे दिमाग में नहीं आया।
$firstElement = true;
foreach ($reportData->result() as $row)
{
if($firstElement) { echo "first element"; $firstElement=false; }
// Other lines of codes here
}
उपरोक्त कोड महान और पूर्ण हैं लेकिन अगर आपको केवल पहले तत्व की आवश्यकता है तो आप इस कोड को आज़मा सकते हैं।
यकीन नहीं तो अभी भी जरूरी है। लेकिन निम्न समाधान पुनरावृत्तियों के साथ काम करना चाहिए और इसकी आवश्यकता नहीं है count
।
<?php
foreach_first_last(array(), function ($key, $value, $step, $first, $last) {
echo intval($first), ' ', intval($last), ' ', $step, ' ', $value, PHP_EOL;
});
foreach_first_last(array('aa'), function ($key, $value, $step, $first, $last) {
echo intval($first), ' ', intval($last), ' ', $step, ' ', $value, PHP_EOL;
});
echo PHP_EOL;
foreach_first_last(array('aa', 'bb', 'cc'), function ($key, $value, $step, $first, $last) {
echo intval($first), ' ', intval($last), ' ', $step, ' ', $value, PHP_EOL;
});
echo PHP_EOL;
function foreach_first_last($array, $cb)
{
$next = false;
$current = false;
reset($array);
for ($step = 0; true; ++$step) {
$current = $next;
$next = each($array);
$last = ($next === false || $next === null);
if ($step > 0) {
$first = $step == 1;
list ($key, $value) = $current;
if (call_user_func($cb, $key, $value, $step, $first, $last) === false) {
break;
}
}
if ($last) {
break;
}
}
}
आप एक अनाम फ़ंक्शन का भी उपयोग कर सकते हैं:
$indexOfLastElement = count($array) - 1;
array_walk($array, function($element, $index) use ($indexOfLastElement) {
// do something
if (0 === $index) {
// first element‘s treatment
}
if ($indexOfLastElement === $index) {
// last not least
}
});
तीन और बातों का उल्लेख किया जाना चाहिए:
array_values
पहले से अपने सरणी को पाइप करना होगा ।$element
तो आपको इसे संदर्भ ( &$element
) द्वारा पास करना होगा ।$indexOfLastElement
अंदर उन्हें use
फिर से सूचीबद्ध करना होगा , यदि आवश्यक हो तो संदर्भ द्वारा।आप काउंटर और सरणी लंबाई का उपयोग कर सकते हैं।
$ सरणी = सरणी (1,2,3,4); $ i = 0; $ लेन = गिनती ($ सरणी); foreach ($ आइटम के रूप में $ सरणी) { अगर ($ i === 0) { // प्रथम } और अगर ($ i === $ लेन - 1) { // अंतिम } //… मैं $ ++; }
foreach ($arquivos as $key => $item) {
reset($arquivos);
// FIRST AHEAD
if ($key === key($arquivos) || $key !== end(array_keys($arquivos)))
$pdf->cat(null, null, $key);
// LAST
if ($key === end(array_keys($arquivos))) {
$pdf->cat(null, null, $key)
->execute();
}
}
का उपयोग करते हुए रीसेट ($ सरणी) और अंत ($ सरणी)
<?php
$arrays = [1,2,3,4,5];
$first = reset($arrays);
$last = end($arrays);
foreach( $arrays as $array )
{
if ( $first == $array )
{
echo "<li>{$array} first</li>";
}
else if ( $last == $array )
{
echo "<li>{$array} last</li>";
}
else
{
echo "<li>{$array}</li>";
}
}
इसे इस्तेमाल करे:
function children( &$parents, $parent, $selected ){
if ($parents[$parent]){
$list = '<ul>';
$counter = count($parents[$parent]);
$class = array('first');
foreach ($parents[$parent] as $child){
if ($child['id'] == $selected) $class[] = 'active';
if (!--$counter) $class[] = 'last';
$list .= '<li class="' . implode(' ', $class) . '"><div><a href="]?id=' . $child['id'] . '" alt="' . $child['name'] . '">' . $child['name'] . '</a></div></li>';
$class = array();
$list .= children($parents, $child['id'], $selected);
}
$list .= '</ul>';
return $list;
}
}
$output .= children( $parents, 0, $p_industry_id);
array_shift
औरarray_pop
। हालाँकि यह एक ऐसा उपाय है, अगर मुझे इस तरह की बात पर अमल करना होता है, तो मैं अब रोख क्रालज के जवाब के साथ रहूँगा ।