मेरे पास एक PHP सरणी है जिसमें 2-5 आइटम हैं।

$z=["itema", "itemb", "itemc", "itemd","iteme"];

मुझे सरणी के माध्यम से जाने और प्रत्येक आइटम को एक-दूसरे के खिलाफ एक बार मैच करने का एक तरीका होना चाहिए। तो आउटपुट जैसा लगेगा

itema vs itemb
itema vs itemc
itema vs itemd
itema vs iteme

itemb vs itemc
itemb vs itemd
itemb vs iteme

itemc vs itemd...ect 

मैं हर आइटम को हिट करने के लिए लूप प्राप्त नहीं कर सकता। मुझे लगता है कि यह लूप में एक लूप होना है क्योंकि मेरा सिर्फ एक लूप काम नहीं करता है।

और इसे केवल एक ही बार जाना है। मैं इस पर काम करने के लिए कैसे खो गया हूँ। कोई भी सहायताकाफी प्रशंसनीय होगी।

php
3
workingxx 16 नवम्बर 2015, 21:10

4 जवाब

सबसे बढ़िया उत्तर

आप दो छोरों के लिए उपयोग कर सकते हैं

$count = count($z);
for ($i = 0; $i < $count - 1; $i++) {
    for ($j = $i + 1; $j < $count; $j++) {
        // compare $z[$i] with $z[$j]...
    }
}

अन्य लूप 0 से n - 2 तक जाता है और आंतरिक लूप बाहरी मान से प्रारंभिक के रूप में मूल्य लेता है और अंत में जाता है।


यदि आपको भी साहचर्य सरणियों को संभालने की आवश्यकता है, जैसे कि एक टिप्पणीकार ने उल्लेख किया है, तो आप इस मामले को संभालने के लिए array_values (और array_keys) का उपयोग कर सकते हैं।

$values = array_values($z);
$keys = array_keys($z); // optional - only used, if you need the keys..
$count = count($values);
for ($i = 0; $i < $count - 1; $i++) {
    for ($j = $i + 1; $j < $count; $j++) {
        // compare $values[$i] with $values[$j]...
        // or $keys[$i] with $keys[$j];
    }
}

नोट: A foreach लूप किसी भी स्थिति में काम नहीं करेगा, क्योंकि आप नहीं कर सकते आंतरिक लूप को सभी मूल्यों को छोड़ देने के लिए कहा, पहले से ही देखा पाश । और foreach लूप सिखाने से इस व्यवहार का परिणाम होगा foreach, वह प्रभावशाली एक सरल for लूप और धीमा जैसा दिखता है। foreach का उपयोग करने में कोई लाभ नहीं है।

5
Philipp 25 जुलाई 2018, 13:48

परीक्षण नहीं, लेकिन कुछ इस तरह:

foreach($z as $item){
  foreach($z as $item2){
    if($item!=$item2){
      echo $item . ' vs ' . $item2;
    }
  }
}
1
David Poirier 16 नवम्बर 2015, 18:19
<?php 
$z=["itema", "itemb", "itemc", "itemd","iteme"];

$sizeZ=count($z);
for ($i = 0; $i < $sizeZ-1; $i++) 
{
    for ($j = $i+1; $j < $sizeZ; $j++) 
    {
        echo $z[$i]." vs ".$z[$j]."<br>";
    }
}
?>

आउटपुट:

itema vs itemb
itema vs itemc
itema vs itemd
itema vs iteme
itemb vs itemc
itemb vs itemd
itemb vs iteme
itemc vs itemd
itemc vs iteme
itemd vs iteme
0
Nana Partykar 16 नवम्बर 2015, 18:46

मेरे विचार में foreach() तब {a {X1}} का उपयोग करना बेहतर है।

foreach() के साथ दृष्टिकोण मुझे साफ दिखता है। for() के साथ दृष्टिकोण गलत नहीं है, लेकिन यह अजीब है।

एक foreach उदाहरण देखें:

$z = array('xxApple' => "itema", 'B' => "itemb", 'C' => "itemc", 'D' => "itemd", 'AAAA' => "iteme");
//$z = array("itema", "itemb", "itemc", "itemd", "iteme"); // works also with this array

$x = array_values($z);
$y = array_keys($z); // Optional
foreach($x as $key1 => $item){
  foreach($x as $key2 => $item2){

    if($key2 <= $key1){
        continue;
    }

    if($item == $item2){
        continue;
    }

    echo $item . ' vs ' . $item2 . '<br>';
    // echo $y[$key1] . ' vs ' . $y[$key2] . '<br>'; // Optional
  }
}


//OUTPUT
itema vs itemb
itema vs itemc
itema vs itemd
itema vs iteme
itemb vs itemc
itemb vs itemd
itemb vs iteme
itemc vs itemd
itemc vs iteme
itemd vs iteme

यहाँ बेंचमार्क परिणाम हैं:

बेंचमार्क # 1

$z = range(0,20000);

$start = time();
$values = array_values($z);
for ($i = 0; $i < count($values) - 1; $i++) {
    for ($j = $i + 1; $j < count($values); $j++) {
    }
}
$end = time();                  
$elapsedTimeA = $end - $start;

// Case A, elapsed time in seconds: 275
echo 'Case A, elapsed time in seconds: ' . $elapsedTimeA; 


$start = time();
$x = array_values($z);
foreach($x as $key1 => $item){
  foreach($x as $key2 => $item2){

    if($key2 <= $key1){
        continue;
    }

    if($item == $item2){
        continue;
    }
  }
}
$end = time();                   
$elapsedTimeB = $end - $start;

// Case B, elapsed time in seconds: 103
echo 'Case B, elapsed time in seconds: ' . $elapsedTimeB; 

बेंचमार्क # 2

$z = range(0,20000);

$start = time();
$values = array_values($z);
$count = count($values);
for ($i = 0; $i < $count - 1; $i++) {
    for ($j = $i + 1; $j < $count; $j++) {
    }
}

$end = time();                  
$elapsedTimeA = $end - $start;

// Case A, elapsed time in seconds: 17
echo 'Case A, elapsed time in seconds: ' . $elapsedTimeA;


$start = time();
$x = array_values($z);
foreach($x as $key1 => $item){
  foreach($x as $key2 => $item2){

    if($key2 <= $key1){
        continue;
    }

    if($item == $item2){
        continue;
    }
  }
}
$end = time();                   
$elapsedTimeB = $end - $start;

// Case B, elapsed time in seconds: 103
echo 'Case B, elapsed time in seconds: ' . $elapsedTimeB; 
0
Julian 25 जुलाई 2018, 09:01