फ़ॉर्च लिस्ट आइटम का रिवर्स ऑर्डर


88

मैं इस कोड की सूची आइटम के क्रम को उलटना चाहूंगा। मूल रूप से यह सबसे पुराने से हाल के वर्षों का एक सेट है और मैं उस आउटपुट को उलटने की कोशिश कर रहा हूं।

<?php
    $j=1;     
    foreach ( $skills_nav as $skill ) {
        $a = '<li><a href="#" data-filter=".'.$skill->slug.'">';
        $a .= $skill->name;                 
        $a .= '</a></li>';
        echo $a;
        echo "\n";
        $j++;
    }
?>  

जवाबों:


186

पीछे की ओर चलना

यदि आप विशुद्ध रूप से PHP समाधान की तलाश में हैं, तो आप बस सूची के माध्यम से पीछे की ओर गिन सकते हैं, इसे फ्रंट-टू-बैक एक्सेस कर सकते हैं:

$accounts = Array(
  '@jonathansampson',
  '@f12devtools',
  '@ieanswers'
);

$index = count($accounts);

while($index) {
  echo sprintf("<li>%s</li>", $accounts[--$index]);
}

उपरोक्त $indexतत्वों की कुल संख्या के लिए सेट है, और फिर अगले पुनरावृत्ति के लिए सूचकांक मूल्य को कम करते हुए, उन्हें वापस-से-सामने पहुंचना शुरू कर देता है।

ऐरे को उलट देना

आप अपने सरणी के मूल्यों को उलटने के लिए array_reverseफ़ंक्शन का लाभ भी उठा सकते हैं , जिससे आप उन्हें रिवर्स ऑर्डर में एक्सेस कर सकते हैं:

$accounts = Array(
  '@jonathansampson',
  '@f12devtools',
  '@ieanswers'
);

foreach ( array_reverse($accounts) as $account ) {
  echo sprintf("<li>%s</li>", $account);
}

2
@ स्लावेक यदि पहले से ही आदेश दिया गया है, तो पीछे की ओर से गिनती करने से बेहतर उलटा क्यों होगा ?
सैम्पसन

1
बिल्कुल सही, array_reverse ने काम किया! धन्यवाद जोनाथन और बाकी सब।
२०

4
@JonathanSampson - क्योंकि यदि आप इसे लूप में उपयोग करने से पहले रिवर्स करते हैं, तो आप इसे भविष्य में बदल सकते हैं। जब आप डेटा के साथ लूप लॉजिक को बांधते हैं, तो ऑर्डर बदलने से लूप भी बदल जाएगा।
स्लावेक

1
@Slawek मुझे यकीन नहीं है कि मैं अनुसरण करता हूँ। सरणी के माध्यम से पीछे की ओर गिनना एक आम बात है, और भविष्य में सरणी को संभालते समय किसी भी सावधानी की आवश्यकता नहीं है क्योंकि यह वास्तव में सरणी को संशोधित नहीं करता है।
सैम्पसन

1
@Slawek मैं वहाँ असहमति में नहीं हूँ। सोचा कि मुझे ऐसा कोई संकेत नहीं दिखाई दे रहा है कि उपयोगकर्ता किसी भी प्रकार के MVC पैटर्न का अनुसरण कर रहा है। निश्चित रूप से, यदि उनके पास एक नियंत्रक, या एक मॉडल है, तो यह कई मामलों में सरणी को सॉर्ट करने के लिए समझदार हो सकता है।
सैम्पसन


21

array_reverse()स्रोत सरणी को परिवर्तित नहीं करता है, लेकिन एक नया सरणी देता है। (देखें array_reverse()।) इसलिए आपको या तो पहले नए सरणी को संग्रहीत करने की आवश्यकता है या केवल लूप के लिए अपनी घोषणा के भीतर फ़ंक्शन का उपयोग करें।

<?php 
    $input = array('a', 'b', 'c');
    foreach (array_reverse($input) as $value) {
        echo $value."\n";
    }
?>

उत्पादन होगा:

c
b
a

तो, ओपी को संबोधित करने के लिए, कोड बन जाता है:

<?php
    $j=1;     
    foreach ( array_reverse($skills_nav) as $skill ) {
        $a = '<li><a href="#" data-filter=".'.$skill->slug.'">';
        $a .= $skill->name;                 
        $a .= '</a></li>';
        echo $a;
        echo "\n";
        $j++;
}

अंत में, मैं यह अनुमान लगाने जा रहा हूं कि $jया तो एक उल्टा चलने के लिए प्रारंभिक प्रयास में इस्तेमाल किया गया काउंटर था $skills_nav, या $skills_navसरणी को गिनने का एक तरीका था । यदि पूर्व, यह अब हटा दिया जाना चाहिए कि आपके पास सही समाधान है। यदि उत्तरार्द्ध, इसे लूप के बाहर, ए के साथ प्रतिस्थापित किया जा सकता है $j = count($skills_nav)


7

यदि आप एरे (या उसकी एक कॉपी कॉपी) को नष्ट करने से गुरेज नहीं करते हैं:

$stack = array("orange", "banana", "apple", "raspberry");

while ($fruit = array_pop($stack)){
    echo $fruit . "\n<br>"; 
}

पैदा करता है:

raspberry 
apple 
banana 
orange 

मुझे लगता है कि यह समाधान इंडेक्स के साथ फ़िडलिंग की तुलना में क्लीनर को पढ़ता है और आपको इंडेक्स हैंडलिंग गलतियों को पेश करने की संभावना कम होती है, लेकिन इसके साथ समस्या यह है कि आपके कोड को पहले सरणी की एक अस्थायी प्रतिलिपि बनाने के लिए संभवतः थोड़ा अधिक समय लगेगा। । किसी इंडेक्स के साथ तेजी से चलने की संभावना है, और यह भी काम में आ सकता है अगर आपको वास्तव में इंडेक्स को संदर्भित करने की आवश्यकता हो, जैसे कि:

$stack = array("orange", "banana", "apple", "raspberry");
$index = count($stack) - 1;
while($index > -1){
    echo $stack[$index] ." is in position ". $index . "\n<br>";
    $index--;
} 

लेकिन जैसा कि आप देख सकते हैं, आपको सूचकांक के साथ बहुत सावधान रहना होगा ...


1
array_popदृष्टिकोण 3 बार की तुलना में धीमी है array_reverse: दृष्टिकोण 3v4l.org/3jaTT
चालाकी

4

यह मानकर कि आपको अनुक्रमित सारणी को बदलना होगा (साहचर्य या बहुआयामी नहीं) लूप के लिए एक सरल तरीका पर्याप्त होगा:

$fruits = ['bananas', 'apples', 'pears'];
for($i = count($fruits)-1; $i >= 0; $i--) {
    echo $fruits[$i] . '<br>';
} 

3

आप छँटाई के नियम बनाने के लिए usort फ़ंक्शन का उपयोग कर सकते हैं


1

यदि आपकी सरणी SQL क्वेरी के माध्यम से पॉप्युलेट होती है, तो MySQL में परिणाम को उलटने पर विचार करें, अर्थात:

SELECT * FROM model_input order by creation_date desc

-1
<?php
    $j=1; 


      array_reverse($skills_nav);   


    foreach ( $skills_nav as $skill ) {
        $a = '<li><a href="#" data-filter=".'.$skill->slug.'">';
        $a .= $skill->name;                 
        $a .= '</a></li>';
        echo $a;
        echo "\n";
        $j++;
    }
?> 

1
array_reverse () स्रोत सरणी को परिवर्तित नहीं करता है, लेकिन एक नया सरणी देता है।
Cláudio सिल्वा
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.