2

私は2つのクエリを実行していますが、それらは以下に示すような配列を返します。

初め:

array(
    array(
        'id' => 1
    ),
    array(
        'id' => 2
    ),
    array(
        'id' => 3
    ),
    array(
        'id' => 4
    ),
)

2番:

array(
    array(
        'id' => 4
    ),
    array(
        'id' => 5
    ),
    array(
        'id' => 6
    ),
    array(
        'id' => 7
    ),
)

でも結局は

$ids = array(1,2,3,4,5,6,7);

しかし、それを行うために私が考えることができる唯一の方法は

$ids = array();
foreach(array($array1, $array2) as $a){
    foreach($a as $id){
        $ids[] = $id['id'];
    }
}
$ids = array_unique($ids);

しかし、それは私にはあまり効率的ではないようです。配列関数が豊富にあるので、もっと良い方法があるかどうか疑問に思っています。

4

2 に答える 2

2

これを処理する方法はいくつかあります。array_merge()おそらく、元の2つの配列から始めて、それをでフラット化しarray_map()、最後にを呼び出すと思いますarray_unique()

// Combine them
$new = array_merge($array1, $array2);
// Flatten them
// array_map() is used to select the 'id' key from each
$new = array_map(function($a) { 
  return $a['id'];
}, $new);
// And get the unique values
$ids = array_unique($new);

print_r($ids);
Array
(
    [0] => 1
    [1] => 2
    [2] => 3
    [3] => 4
    [5] => 5
    [6] => 6
    [7] => 7
)

より良い:1つのクエリでそれを行います。

クエリを見た後、これらは2つの配列である必要はありません。これは、単一のUNIONクエリで実行できます。UNIONの代わりにプレーンを使用するUNION ALLと、重複排除されます。

SELECT
  game_id AS id
FROM user_game 
WHERE user_id = :userid
UNION
SELECT
  id
FROM games
WHERE referee_id = :userid OR reviewer_id = :userid
ORDER BY id

行をフェッチするときは、列が1つしかないため、フェッチで直接フラット化することを検討してください。

// For example
while ($row = $stmt->fetch()) {
  // Pluck only the id from the row fetched
  $ids[] = $row['id'];
}
// $ids is now a 1D array.
于 2013-02-01T02:58:46.557 に答える
0

これがあなたが探しているものであるかどうかはわかりませんが、試してみてください:

array_unique(array_merge($firstArr, $secndArr));

おそらく、配列が連想的であるためではありませんが、少なくともいくつかの手順をスキップできます。

于 2013-02-01T03:01:20.307 に答える