2016-12-01 24 views
6

Bir ebeveyn dizisini çocuklara, bir dizi çocuğa ebeveynlere dönüştürmem gerekiyor. Örneğin, böyle bir dizi var:PHP'de iki boyutlu ilişkisel diziyi çevirin

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

Ve bu çevirmek istiyorum:

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

] 

iç içe foreach döngüleri kullanmadan bu görevi başarmak için bir yol var mı? Değilse, bunu yapmanın en etkili yolu nedir?

Şimdiden teşekkürler!

cevap

5
array_merge_recursive, array_combine ve array_fill işlevleri kullanarak

Kısa çözüm:

$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); 

çıkışı: "verimlilik" açısından

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

ben iç içe bir döngü, bu durumda, daha iyi olduğuna inanıyorum:

$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); 

C alma girişiminde bulunma array_map gibi diğer işlevlerle reative, en azından this answer'a göre daha yavaş olabilir. Kendi ölçütlerinden bazılarını çalıştırmaya değer olabilir.

0

Kapatma ve array_map'u kullanarak (yalnızca array_map öğesinin eşdeğer for döngüsünden daha hızlı yürütmesini umuyor olabilirsiniz ... yerel bir işlev olması gerekmez mi?).

$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";