2

ユーザーIDの4つの異なる配列を返す4つの個別のmysqlクエリを実行します。すべての配列で発生するユーザーIDについてすべての配列をチェックしてから、それらの値を使用して新しい配列を作成し、それを別のクエリで使用できるようにする必要があります。

Array ( [0] => Array ( [userid] => 11 ) 
        [1] => Array ( [userid] => 22 ) 
        [2] => Array ( [userid] => 33 ) 
      ) 
Array ( [0] => Array ( [userid] => 11 ) 
        [1] => Array ( [userid] => 99 ) 
        [2] => Array ( [userid] => 33 ) 
      ) 
Array ( [0] => Array ( [userid] => 11 ) 
        [1] => Array ( [userid] => 33 ) 
      ) 
Array ( [0] => Array ( [client_id] => 11 )
        [1] => Array ( [client_id] => 33 )
        [2] => Array ( [client_id] => 99 )
      )

したがって、これら4つの配列からの最終的な配列は次のようになります。

Array ( [0] => Array ( [id] => 11 ) 
        [1] => Array ( [id] => 33 ) 
      ) 

私はミッキーマウスで解決策を試してarray_count_valuesいましたが、あまり成功していませんでした。

4

2 に答える 2

1

おそらく、MySQLとの結合/結合を使用して4〜5の個別のクエリではなく、単一のクエリでこれを行うことができますが、データベースのクエリと設計を確認しないと、それを確信できません。しかし、私はあなたができることを賭けても構わないと思っています。パフォーマンスが低下するため、クエリの量をできるだけ少なくするようにしてください。

上記の次のステートメントとは別に、これはいくつかの方法の1つを処理できます。

最も実用的ですか?

たとえば$user_idsという名前の空の配列を作成します

各配列をループし、配列$ user_ids内のSQLデータからuser_idを使用してインデックスを作成し、その値に1を追加して、カウンターとして機能するようにします。SQLデータのループが終了したら、カウンター配列をループし、ループする配列の数より少ない数を設定解除します。

例:

    $user_ids = array();
    $mysql_dataset = array($first_array, $second_array, $third_array, $fourth_array);

    foreach ($mysql_dataset as $mysql_data) {
            foreach ($mysql_data as $user) {
                    if (empty($user_ids[$user['user_id']])) {
                            $user_ids[$user['user_id']] = 0;
                    }

                    $user_ids[$user['user_id']]++;
            }
    }

    foreach ($user_ids as $user_id => $count) {
            if ($count < 4) {
                    unset($user_ids[$user_id]);
            }
    }

    print_r($user_ids);
于 2013-01-29T03:36:38.113 に答える
1

PHPの組み込み配列関数は、多くの手動ループに頼ることなく、必要なもののほとんどをわずか数行で処理できます。

これらの配列には異なるキーがあるため、それぞれを実行して必要array_map()なキーを抽出し、単一の次元にフラット化できます。次に、結果の4つの配列を呼び出しarray_intersect()て、交差するIDを取得します。

http://codepad.viper-7.com/x0Ncm0

// Your original arrays...
$a1 = array(array('userid'=>11),array('userid'=>22),array('userid'=>33));
$a2 = array(array('userid'=>11),array('userid'=>99),array('userid'=>33));
$a3 = array(array('userid'=>11),array('userid'=>33));
$a4 = array(array('client_id'=>11),array('client_id'=>33),array('client_id'=>99));

// Flatten each array using array_map() to return the desired key
function callback_userid($a) { return $a['userid']; }
function callback_client_id($a) { return $a['client_id']; }

$a1flat = array_map('callback_userid', $a1);
$a2flat = array_map('callback_userid', $a2);
$a3flat = array_map('callback_userid', $a3);
$a4flat = array_map('callback_client_id', $a4);

// Then get an intersection of all four flattened arrays
print_r(array_intersect($a1flat, $a2flat, $a3flat, $a4flat));

Array
(
    [0] => 11
    [2] => 33
)

キーのインデックスをゼロから再作成する場合は、出力配列を呼び出しarray_values()ます。または、キーを付けて2D配列を作成する必要がある場合はid、ループを実行します。

foreach ($output as $key => $value) {
  // Append a new array with 'id'
  $output[] = array('id' => $value);
  // unset the original key
  unset($output[$key]);
}

ただし、これらの4つのクエリを非常に明確な目的で使用していない場合(したがって、これらを個別に実行する必要がない場合)、単一のSQLクエリでこの情報を引き出すことができる可能性があります。しかし、これ以上コードを見ずに言うのは難しいです。

于 2013-01-29T03:38:27.703 に答える