2010-03-25 14 views
19

मैं इस समस्या को अब थोड़ी देर के लिए मेरे मन झुकने लिया है (सिर ठंड या तो मदद नहीं करता है!), मूल रूप से मैं एक PHP सरणी जो इस उदाहरण की तरह लग रहा है:पीएचपी 2 डी सरणी उत्पादन सभी संयोजनों

$array[0][0] = 'apples'; 
$array[0][1] = 'pears'; 
$array[0][2] = 'oranges'; 

$array[1][0] = 'steve'; 
$array[1][1] = 'bob'; 

और मैं इन के हर संभव संयोजन के साथ इस एक मेज से उत्पादन करने में सक्षम होना चाहते हैं, लेकिन उदाहरण इस होगा उत्पादन

Array 0   Array 1 
apples    steve 
apples    bob 
pears    steve 
pears    bob 

लेकिन मैं करूंगा के लिए (अपनी स्थिति की परवाह किए बिना) किसी भी संयोजन को दोहरा, इसलिए बिना इस तरह के रूप में possib के रूप में कई अलग-अलग सरणी के साथ काम करने में सक्षम होने के लिए le।

+0

वहाँ होगा सरणी 2, सरणी 3, सरणी एन? या केवल दो सरणी? –

+0

हाय स्पष्ट करने के लिए खेद है, सरणी 2 तक सरणी 2, सरणी 3 हो सकती है। धन्यवाद। – stukerr

+0

आपको एसक्यूएल में आसान क्रॉस में शामिल होने की आवश्यकता है, लेकिन PHP –

उत्तर

20

इसे "कार्टेशियन उत्पाद" कहा जाता है, एआरएस http://php.net/manual/en/ref.array.php पर PHP मैन पेज कुछ कार्यान्वयन (टिप्पणियों में) दिखाता है।

और यहाँ एक और एक अभी तक है:

SELECT * 
FROM `options`, `groups` 

बस इतना ही :)

+0

ग्रेट स्टफ, बस मुझे जो चाहिए था। बहुत धन्यवाद – stukerr

+0

वास्तविक पृष्ठ को वहां रखने देता है: http://php.net/manual/en/ref.array.php :) –

+1

यदि यह फ़ंक्शन किसी कक्षा में रहता है, तो आप user_func कॉल को इस प्रकार बदलना चाहेंगे: ' $ सी = call_user_func_array (सरणी ($ यह, __ Function__), $ _); '। इसके अलावा, यह इनपुट-एरे बराबर आकार के नहीं होने पर चेतावनी (सरणी नहीं) दे सकता है। – Nanne

-2

MySQL डेटाबेस में इस तरह किया जाएगा मुझे एहसास हुआ कि यह दूसरों के द्वारा किए गए समान ही है, लेकिन यह आपको अनुरोधित प्रारूप में एक सरणी देता है। खराब परिवर्तनीय नामकरण के लिए खेद है।

$output = array(); 
combinations($array, $output); 
print_r($output); 

function combinations ($array, & $output, $index = 0, $p = array()) { 
    foreach ($array[$index] as $i => $name) { 
     $copy = $p; 
     $copy[] = $name; 
     $subIndex = $index + 1; 
     if (isset($array[$subIndex])) { 
      combinations ($array, $output, $subIndex, $copy); 
     } else { 
      foreach ($copy as $index => $name) { 
       if (!isset($output[$index])) { 
        $output[$index] = array(); 
       } 
       $output[$index][] = $name; 
      } 
     } 
    } 
} 
1

यह काम करता है मुझे लगता है कि - हालांकि इसे लिखने के बाद:

function array_cartesian() { 
    $_ = func_get_args(); 
    if(count($_) == 0) 
     return array(array()); 
    $a = array_shift($_); 
    $c = call_user_func_array(__FUNCTION__, $_); 
    $r = array(); 
    foreach($a as $v) 
     foreach($c as $p) 
      $r[] = array_merge(array($v), $p); 
    return $r; 
} 

$cross = array_cartesian(
    array('apples', 'pears', 'oranges'), 
    array('steve', 'bob') 
); 

print_r($cross); 
1

@ user187291

मैं संशोधित इस

function array_cartesian() { 
    $_ = func_get_args(); 
    if (count($_) == 0) 
     return array(); 
    $a = array_shift($_); 
    if (count($_) == 0) 
     $c = array(array()); 
    else 
     $c = call_user_func_array(__FUNCTION__, $_); 
    $r = array(); 
    foreach($a as $v) 
     foreach($c as $p) 
      $r[] = array_merge(array($v), $p); 
    return $r; 
} 

तो यह रिटर्न कि सभी महत्वपूर्ण खाली सरणी (कोई संयोजन के रूप में एक ही परिणाम) जब आप 0 तर्क पारित किया जाना है।

केवल इस पर ध्यान क्योंकि मैं इसे

$combos = call_user_func_array('array_cartesian', $array_of_arrays); 
4

आप सरणियों के कार्तीय उत्पाद के लिए देख रहे हैं की तरह उपयोग कर रहा हूँ, और वहाँ php सरणियों साइट पर एक उदाहरण है: http://php.net/manual/en/ref.array.php

1
foreach($parentArray as $value) { 
    foreach($subArray as $value2) { 
     $comboArray[] = array($value, $value2); 
    } 
} 

मेरा न्याय मत करो ..

+0

"निश्चित रूप से यह काम करना चाहिए जब आकार ($ सरणी)> = 2." –

0
function array_comb($arrays) 
{ 
    $result = array(); 
    $arrays = array_values($arrays); 
    $sizeIn = sizeof($arrays); 
    $size = $sizeIn > 0 ? 1 : 0; 
    foreach ($arrays as $array) 
     $size = $size * sizeof($array); 
    for ($i = 0; $i < $size; $i ++) 
    { 
     $result[$i] = array(); 
     for ($j = 0; $j < $sizeIn; $j ++) 
      array_push($result[$i], current($arrays[$j])); 
     for ($j = ($sizeIn -1); $j >= 0; $j --) 
     { 
      if (next($arrays[$j])) 
       break; 
      elseif (isset ($arrays[$j])) 
       reset($arrays[$j]); 
     } 
    } 
    return $result; 
} 
3

सैम ने http://www.php.net/manual/en/ref.array.php#54979 की प्रतिलिपि बनाई लेकिन मैंने इसे अनुकूलित किया

function array_cartesian($arrays) { 
    $result = array(); 
    $keys = array_keys($arrays); 
    $reverse_keys = array_reverse($keys); 
    $size = intval(count($arrays) > 0); 
    foreach ($arrays as $array) { 
    $size *= count($array); 
    } 
    for ($i = 0; $i < $size; $i ++) { 
    $result[$i] = array(); 
    foreach ($keys as $j) { 
     $result[$i][$j] = current($arrays[$j]); 
    } 
    foreach ($reverse_keys as $j) { 
     if (next($arrays[$j])) { 
     break; 
     } 
     elseif (isset ($arrays[$j])) { 
     reset($arrays[$j]); 
     } 
    } 
    } 
    return $result; 
} 
2

मैं भी ऐसा ही करने की जरूरत है और मैं पिछले समाधान यहां पोस्ट की कोशिश की लेकिन उन्हें काम करने नहीं कर सकता है: एक साहचर्य संस्करण बन गया। मुझे इस चतुर लड़के http://www.php.net/manual/en/ref.array.php#54979 से नमूना मिला। हालांकि, उनके नमूने ने दोहराने वाले संयोजनों की अवधारणा को प्रबंधित नहीं किया था। तो मैंने उस भाग को शामिल किया।यहाँ मेरी संशोधित संस्करण है, आशा है कि यह मदद करता है:

$data = array(
     array('apples', 'pears', 'oranges'), 
     array('steve', 'bob') 
    ); 

    $res_matrix = $this->array_cartesian_product($data); 

    foreach ($res_matrix as $res_array) 
    { 
     foreach ($res_array as $res) 
     { 
      echo $res . " - "; 
     } 
     echo "<br/>"; 
    } 


function array_cartesian_product($arrays) 
{ 
    $result = array(); 
    $arrays = array_values($arrays); 

    $sizeIn = sizeof($arrays); 
    $size = $sizeIn > 0 ? 1 : 0; 
    foreach ($arrays as $array) 
     $size = $size * sizeof($array); 
    $res_index = 0; 
    for ($i = 0; $i < $size; $i++) 
    { 
     $is_duplicate = false; 
     $curr_values = array(); 
     for ($j = 0; $j < $sizeIn; $j++) 
     { 
      $curr = current($arrays[$j]); 
      if (!in_array($curr, $curr_values)) 
      { 
       array_push($curr_values , $curr); 
      } 
      else 
      { 
       $is_duplicate = true; 
       break; 
      } 
     } 
     if (!$is_duplicate) 
     { 
      $result[ $res_index ] = $curr_values; 
      $res_index++; 
     } 
     for ($j = ($sizeIn -1); $j >= 0; $j--) 
     { 
      $next = next($arrays[ $j ]); 
      if ($next) 
      { 
       break; 
      } 
      elseif (isset ($arrays[ $j ])) 
      { 
       reset($arrays[ $j ]); 
      } 
     } 
    } 
    return $result; 
} 

परिणाम कुछ इस तरह होगा:
सेब - स्टीव
सेब - बॉब
नाशपाती - स्टीव
नाशपाती - बॉब
संतरे - स्टीव

: -
संतरे बॉब

डेटा सरणी कुछ इस तरह है कि आप तो लाभ - -

कमाल कमाल
कमाल - प्रस्ताव - कमाल
कमाल - इनाम - कमाल
कमाल - लाभ - कमाल
कमाल - प्रस्ताव -:

$data = array(
     array('Amazing', 'Wonderful'), 
     array('benefit', 'offer', 'reward'), 
     array('Amazing', 'Wonderful') 
    ); 

तो यह कुछ इस तरह प्रिंट होगा कमाल
अद्भुत - इनाम - कमाल

0

मुझे उत्पाद विकल्पों से संयोजन करना पड़ा। यह समाधान प्रत्यावर्तन का उपयोग करता है और 2 डी सरणी के साथ काम करता है: देशी अजगर कार्य के आधार पर

function options_combinations($options) { 
    $result = array(); 
    if (count($options) <= 1) { 
     $option = array_shift($options); 
     foreach ($option as $value) { 
      $result[] = array($value); 
     } 
    } else { 
     $option = array_shift($options); 
     $next_option = options_combinations($options); 
     foreach ($next_option as $next_value) { 
      foreach ($option as $value) { 
       $result[] = array_merge($next_value, array($value)); 
      } 
     } 
    } 
    return $result; 
} 

$options = [[1,2],[3,4,5],[6,7,8,9]]; 
$c = options_combinations($options); 
foreach ($c as $combination) { 
    echo implode(' ', $combination)."\n"; 
} 
0

सुरुचिपूर्ण कार्यान्वयन itertools.product

function direct_product(array ...$arrays) 
{ 
    $result = [[]]; 
    foreach ($arrays as $array) { 
     $tmp = []; 
     foreach ($result as $x) { 
      foreach ($array as $y) { 
       $tmp[] = array_merge($x, [$y]); 
      } 
     } 
     $result = $tmp; 
    } 
    return $result; 
} 
संबंधित मुद्दे