PHP

2016-12-01 1 views
6

में दो-आयामी सहयोगी सरणी फ्लिप करें, मुझे माता-पिता को बच्चों की एक श्रृंखला में बच्चों के लिए माता-पिता की एक सरणी बदलने की आवश्यकता है। उदाहरण के लिए, मैं इस तरह एक सरणी है:PHP

[ 
    1 => [a,b,c], 
    2 => [b,c,d], 
    3 => [c,d,e], 
] 

और मैं इसे इस में बदल करना चाहते हैं:

[ 
    a => [1], 
    b => [1,2], 
    c => [1,2,3], 
    d => [2,3], 
    e => [3] 

] 

वहाँ नेस्टेड foreach छोरों का उपयोग किए बिना इस कार्य को पूरा करने के लिए एक रास्ता है? यदि नहीं, तो ऐसा करने का सबसे प्रभावी तरीका क्या है?

अग्रिम धन्यवाद!

उत्तर

5

लघु समाधान array_merge_recursive, array_combine और array_fill फ़ंक्शन का उपयोग करके

$arr = [ 
    1 => ['a','b','c'], 
    2 => ['b','c','d'], 
    3 => ['c','d','e'], 
]; 

$result = []; 
foreach ($arr as $k => $v) { 
    $result = array_merge_recursive($result, array_combine($v, array_fill(0, count($v), [$k]))); 
} 

print_r($result); 

उत्पादन:

Array 
(
    [a] => Array 
     (
      [0] => 1 
     ) 

    [b] => Array 
     (
      [0] => 1 
      [1] => 2 
     ) 

    [c] => Array 
     (
      [0] => 1 
      [1] => 2 
      [2] => 3 
     ) 

    [d] => Array 
     (
      [0] => 2 
      [1] => 3 
     ) 

    [e] => Array 
     (
      [0] => 3 
     ) 
) 
2

"दक्षता" के संदर्भ में मेरा मानना ​​है कि एक नेस्टेड पाश, इस मामले में, बेहतर है:

$arr = [1 => ['a','b','c'], 
     2 => ['b','c','d'], 
     3 => ['c','d','e']]; 

$result = []; 
foreach ($arr as $key => $value) { 
    foreach ($value as $v) { 
     $result[$v][] = $key; 
    } 
} 

var_dump($result); 

सी प्राप्त करने का प्रयास array_map जैसे अन्य कार्यों के साथ प्रतिक्रियाशील कम से कम this answer के अनुसार धीमा हो सकता है। अपने कुछ बेंचमार्क चलाने के लायक हो सकता है।

0

बंद करने और array_map का उपयोग करके (केवल उम्मीद है कि array_map समतुल्य for चक्र से तेज़ निष्पादित हो सकता है ... क्या यह मूल कार्य नहीं होना चाहिए?)।

$multimap=[ 
    1 => [a,b,c], 
    2 => [b,c,d], 
    3 => [c,d,e], 
]; 

$result=[]; 
foreach($multimap as $k=>$arr) { 
    $callme=function($e) use (&$result, $k) { 
    if(! array_key_exists ($e, $result)) { 
     $result[$e]=[]; 
    } 
    $result[$e][]=$k; 
    return $e; // not that it matters what is returned, we're after the side-effects 
    }; 
    array_map($callme, $arr); 
} 

// just as yet another alternative to var_dump/print_r 
echo json_encode($result /*, JSON_PRETTY_PRINT */)."\n"; 
संबंधित मुद्दे

 संबंधित मुद्दे