0

配列の配列が与えられます:

$items = array(
  array(
    'id' => '1',
    'property_a' => 'a,b,c',
    'property_b' => '1,2,3'
    'property_c' => 'x,y'
  ),
  array(
    'id' => '2',
    'property_a' => 'b,c,d',
    'property_b' => '3,4,5',
    'property_c' => 'x,y'
  )  
);

この配列の各項目は、コンマで区切られたすべての値ではなく一部の値で分割する必要があります。

$splitItemsBy = array('property_a', 'property_b');

結果は、定義された $splitItemsBy キー値の一意の組み合わせを持つ項目の配列になります。

望ましい結果:

[
  ['id' => '1', 'property_a' => 'a', 'property_b' => '1', 'property_c' => 'x,y']
  ['id' => '1', 'property_a' => 'b', 'property_b' => '1', 'property_c' => 'x,y']
  ['id' => '1', 'property_a' => 'c', 'property_b' => '1', 'property_c' => 'x,y']
  ['id' => '1', 'property_a' => 'a', 'property_b' => '2', 'property_c' => 'x,y']
  ['id' => '1', 'property_a' => 'a', 'property_b' => '3', 'property_c' => 'x,y']
  ['id' => '1', 'property_a' => 'b', 'property_b' => '2', 'property_c' => 'x,y']
  ['id' => '1', 'property_a' => 'b', 'property_b' => '3', 'property_c' => 'x,y']
  ['id' => '1', 'property_a' => 'c', 'property_b' => '2', 'property_c' => 'x,y']
  ['id' => '1', 'property_a' => 'c', 'property_b' => '3', 'property_c' => 'x,y']

  ['id' => '2', 'property_a' => 'b', 'property_b' => '3', 'property_c' => 'x,y']
  ['id' => '2', 'property_a' => 'c', 'property_b' => '3', 'property_c' => 'x,y']
  ['id' => '2', 'property_a' => 'd', 'property_b' => '3', 'property_c' => 'x,y']
  ['id' => '2', 'property_a' => 'b', 'property_b' => '4', 'property_c' => 'x,y']
  ['id' => '2', 'property_a' => 'b', 'property_b' => '5', 'property_c' => 'x,y']
  ['id' => '2', 'property_a' => 'c', 'property_b' => '4', 'property_c' => 'x,y']
  ['id' => '2', 'property_a' => 'c', 'property_b' => '5', 'property_c' => 'x,y']
  ['id' => '2', 'property_a' => 'd', 'property_b' => '4', 'property_c' => 'x,y']
  ['id' => '2', 'property_a' => 'd', 'property_b' => '5', 'property_c' => 'x,y']
]

PHPでこれを行うための効率的でエレガントな方法はありますか?

すべての提出物に事前に感謝します。SQLでそれを解決するためのボーナスポイント。行け!

編集:私がそれを解決した方法

あなたが実際に私の仕事をしていないことを示すために、これが私のアプローチです (複雑すぎると感じます)。

[...]

4

2 に答える 2

1

の目的の結果を並べ替えるid = 1と、グループ化がどのように機能するかがより明確になります。

['id' => '1', 'property_a' => 'a', 'property_b' => '1', 'property_c' => 'x,y']
['id' => '1', 'property_a' => 'b', 'property_b' => '1', 'property_c' => 'x,y']
['id' => '1', 'property_a' => 'c', 'property_b' => '1', 'property_c' => 'x,y']
['id' => '1', 'property_a' => 'a', 'property_b' => '2', 'property_c' => 'x,y']
['id' => '1', 'property_a' => 'b', 'property_b' => '2', 'property_c' => 'x,y']
['id' => '1', 'property_a' => 'c', 'property_b' => '2', 'property_c' => 'x,y']
['id' => '1', 'property_a' => 'a', 'property_b' => '3', 'property_c' => 'x,y']
['id' => '1', 'property_a' => 'b', 'property_b' => '3', 'property_c' => 'x,y']
['id' => '1', 'property_a' => 'c', 'property_b' => '3', 'property_c' => 'x,y']

元の配列の単純化されたバージョンを使用して、上記を次のように取得できます。

$set1 = 'a,b,c';
$set2 = '1,2,3';

$array1 = explode(",",$set1);
$array2 = explode(",",$set2);

foreach($array1 as $set1_member) {
    foreach($array2 as $set2_member) {
        $collection[] = array($set1_member, $set2_member);
    }
}

で配列をエコーアウトすると、次のようjson_encodeに返されます。

[
["a","1"],
["a","2"],
["a","3"],
["b","1"],
["b","2"],
["b","3"],
["c","1"],
["c","2"],
["c","3"]
]
于 2013-09-20T11:18:31.133 に答える
1

PostgreSQL の場合

SELECT id, 
  unnest(property_a) as property_a,
  property_b,
  property_c
FROM (
SELECT id, 
  property_a,
  unnest(property_b) as property_b,
  property_c
FROM
  sets) AS q;

フィドル

または、より伝統的に、異なるテーブルのプロパティのデータを使用します (property_c は文字列として 1 つの行に格納できますが、それは実際には重要ではありません)。

SELECT a.id, 
  a.property_a,
  b.property_b,
  array_agg(c.property_c) as property_c
FROM  a 
  JOIN b ON a.id=b.id
  JOIN c ON b.id=c.id
GROUP BY a.id, a.property_a,b.property_b;

フィドル

于 2013-09-20T12:37:28.837 に答える