2016-04-12 20 views
1

答えを出す前に、全体の質問をお読みください。私は2つの連想配列を持っている場合、一部の値が一度だけ一致場所:PHPでキーと値を再フォーマット

$array1 = ['key1' => 'value1', 'key3' => 'value2', etc...]; 
$array2 = ['key2' => 'value1', 'key4' => 'value2', etc...]; 

が、$配列2は長い$アレイ1よりも、それらの例には、キーに値がありません。そして、

$array1 = ['key1' => 'value1', 'key3' => 'value2']; 
$array2 = ['key2' => 'value1', 'key4' => 'value2', 'key5' => 'value3']; 

を一致がない場合には、空の文字列が埋め込まれた連想配列に代わり、キーの使用されていることを

$array3 = [ 
'value1' => [$myconstant => key2], 
'value2' => [$myconstant => key4], 
'value3' => [$myconstant => ''], 
etc...]; 

のお知らせ:どのように私は彼らが次のような結果を得るために組み合わせることができます。実際、$ array1が必要な唯一の理由は、正しいフォーマットを得るために$ array2との一致がいつあるかを知る必要があるからです。

値はetc ...チェーンに沿って繰り返されません。

私はLaravelを使用しており、コレクションを使用しようとしていますが、基本的なPHPソリューションも大丈夫です。どうもありがとうございました。

+0

2つの配列がどのように接続されているかわかりません。 array2のキーとして値を使用し、array2の値としてキーだけを使用します。値がarray1にも存在する場合にのみキーを使用したい場合は、それ以外の場合は空の値を使用します。 – Rizier123

+0

'$ myconstant'は何でも構いませんか? –

答えて

1

あなたが持っている最大のハードルは、キーとキーの値を値に変換する方法だと思います。 array_flipがその問題に対する答えです。いったんそれができたら、簡単なforeachループで問題を解決できます。

$myconstant = 'foo'; 
$array1 = ['key1' => 'value1', 'key3' => 'value2']; 
$array2 = ['key2' => 'value1', 'key4' => 'value2', 'key5' => 'value3']; 

// array_flip switches keys and values in an array 
$flip1 = array_flip($array1); 
$flip2 = array_flip($array2); 

$array3 = []; 
foreach($flip2 as $key => $value) { 
    if(!isset($flip1[$key])) { 
     $array3[ $key ] = [ $myconstant => '' ]; 
    } else { 
     $array3[ $key ] = [ $myconstant => $value ];  
    } 

} 

Laravelコレクションは、あまりにも、flip()方法を持っています。それはスクリプトをLaravelに翻訳するのに役立ちます。

1
<?php 

$array1 = ['key1' => 'value1', 'key3' => 'value2']; 
$array2 = ['key2' => 'value1', 'key4' => 'value2', 'key5' => 'value3']; 

function x (array $a= array(), array $b = array()) { 
    $array = array(); 
    $index = new ArrayObject($a); 
    $seed = new ArrayObject($b); 

    $a_it = $index->getIterator(); 
    $b_it = $seed->getIterator(); 

    while ($a_it->valid()) { 
     $x = $a_it->current(); 
     $y = ($b_it->valid()) ? $b_it->current() : NULL; 

     if ($y !== NULL) { 
      # there is a value to compare against 
      if ($x === $y) { 
       $array["{$x}"] = array('myConst'=>$a_it->key()); 
      } 
      $b_it->next(); 
     } else { 
      # there is no value to compare against 
      $array["{$x}"] = array('myConst'=> ''); 
     } 
     $a_it->next(); 
    } 
    return $array; 
} 

$read = x($array2, $array1); 
print_r($read); 
+0

ようこそスタックオーバーフロー!このコードスニペットは問題を解決するかもしれませんが、[説明を含む](http://meta.stackexchange.com/questions/114762/explaining-entirely-code-based-answers)は本当にあなたの投稿の質を向上させるのに役立ちます。将来読者の質問に答えていることを覚えておいてください。そうした人々はあなたのコード提案の理由を知らないかもしれません。あなたのコードに説明的なコメントを詰め込まないようにしてください。これは、コードと説明の両方の可読性を低下させます! – Rizier123