7

मैं इस algorithm that will take numbers or words and find all possible combinationsपीएचपी सभी संयोजनों

देखा और मैं यह उपयोग कर रहा हूँ ले, लेकिन यह सब 'असली' संयोजन वापस नहीं करता है।

पीएचपी:

<?php 
    require_once 'Math/Combinatorics.php'; 
    $words = array('cat', 'dog', 'fish'); 
    $combinatorics = new Math_Combinatorics; 
    foreach($combinatorics->permutations($words, 2) as $p) { 
     echo join(' ', $p), "\n"; 
    } 
?> 

और यह देता है:

cat dog 
dog cat 
cat fish 
fish cat 
dog fish 
fish dog 

लेकिन इन सभी वास्तविक संयोजन नहीं हैं, सभी वास्तविक संयोजन इन भी शामिल हैं:

cat cat 
dog dog 
fish fish 

और वह क्या है मुझे जरूरत है, सभी असली संयोजन प्राप्त करने की विधि:

cat dog 
dog cat 
cat fish 
fish cat 
dog fish 
fish dog 
cat cat 
dog dog 
fish fish 
+0

आप इन संयोजनों अपने आप को क्यों नहीं जोड़ते? आपके डेटा के माध्यम से लूप करने के लिए काफी आसान लगता है और जोड़े को मैन्युअल रूप से जोड़ता है। –

+0

क्या यह वही प्रश्न नहीं है जैसा पहले है? ऐसा लगता है कि आपको जवाब पर संदेह है। क्यों नहीं जारी रहे? – Nanne

+3

Math_Combinatorics - "एक पैकेज जो किसी दिए गए सेट और सबसेट आकार के बिना सभी संयोजनों और क्रमपरिवर्तनों को वापस करता है। एसोसिएटिव सरणी संरक्षित होती है।" यहां कुंजी "पुनरावृत्ति के बिना" है। – strkol

उत्तर

9

ठीक है, यहाँ अपने कोड है (और btw, इस तरह के एक दिलचस्प और चुनौतीपूर्ण समस्या पोस्ट करने के लिए धन्यवाद - मेरे लिए कम से कम ... :-)) - सभी संभव क्रमपरिवर्तन (एन) के द्वारा लिए प्रत्यावर्तन का उपयोग कर एक सरणी दिया तत्वों का)

कोड:

<?php 

function permutations($arr,$n) 
{ 
    $res = array(); 

    foreach ($arr as $w) 
    { 
      if ($n==1) $res[] = $w; 
      else 
      { 
       $perms = permutations($arr,$n-1); 

       foreach ($perms as $p) 
       { 
         $res[] = $w." ".$p; 
       } 
      } 
    } 

    return $res; 
} 

// Your array 
$words = array('cat','dog','fish'); 

// Get permutation by groups of 3 elements 
$pe = permutations($words,3); 

// Print it out 
print_r($pe); 

?> 

आउटपुट:

Array 
(
    [0] => cat cat cat 
    [1] => cat cat dog 
    [2] => cat cat fish 
    [3] => cat dog cat 
    [4] => cat dog dog 
    [5] => cat dog fish 
    [6] => cat fish cat 
    [7] => cat fish dog 
    [8] => cat fish fish 
    [9] => dog cat cat 
    [10] => dog cat dog 
    [11] => dog cat fish 
    [12] => dog dog cat 
    [13] => dog dog dog 
    [14] => dog dog fish 
    [15] => dog fish cat 
    [16] => dog fish dog 
    [17] => dog fish fish 
    [18] => fish cat cat 
    [19] => fish cat dog 
    [20] => fish cat fish 
    [21] => fish dog cat 
    [22] => fish dog dog 
    [23] => fish dog fish 
    [24] => fish fish cat 
    [25] => fish fish dog 
    [26] => fish fish fish 
) 

संकेत:permutations($words,2) करके, आप वास्तव में प्राप्त करने के लिए आप चाहते थे सक्षम हो जाएगा ...

+0

आपको बहुत धन्यवाद, बस मुझे चाहिए, धन्यवाद :) – Minion

+0

@ मेरा स्वागत है आपका स्वागत है! :-) –

+0

मैं स्ट्रिंग की सरणी के बजाय सरणी की सरणी वापस करने के लिए इसे परिवर्तित करने की कोशिश कर रहा हूं। इसलिए प्रत्येक आंतरिक सरणी में $ n तत्व होंगे। यह लगता है कि यह होना चाहिए से अधिक कठिन साबित हो रहा है ... –

0

आपके मौजूदा कोड आप क्रमपरिवर्तन, बस डुप्लिकेट जोड़ने देता है:

foreach($words as $w) { 
    echo "$w $w\n";  
} 

समस्या क्या है?

+0

समस्या यह है कि यह गैर-सामान्य है, और यदि आप 2 आयामों के साथ काम कर रहे हैं तो काम नहीं करेंगे: 3 आयामों में उन्हें बिल्ली बिल्ली मछली, बिल्ली मछली बिल्ली, मछली बिल्ली बिल्ली जोड़ने की आवश्यकता होगी। आदि ... फिर combinatorics। –