ユーザーが何千もの電子メール アドレスを貼り付けるために使用できる HTML テキスト領域があります。テキストエリアから重複した電子メール アドレスを削除したい場合は、次の方法の方がコストがかかりません。
- すべての電子メール アドレスを MySQL データベースに挿入し、
SELECT DISTINCT
クエリを実行します。 - すべての電子メール アドレスを PHP 配列にロードし、
array_unique()
?
ありがとう!
任意のレコードを MySQL テーブルに挿入するよりも、リクエストごとにこれを処理する方がよいでしょう。重複するかどうかを知らずに各レコードをテーブルに挿入すると、最終的には重複を削除するスクリプトを作成する必要があります。
例えば:
テキスト領域に、POST 要求の電子メールのコンマ区切りリストが含まれているとします。
$emails = $_POST['email'];
// in real life you will want to validate each string with a regex
$emails = preg_split('/,/', $emails);
// or you could do explode(",", $emails);
// acknowledge possession of an array
$unique_emails = array();
foreach($emails as $key => $value)
{
$unique_emails[$value] = $value;
}
// unique_emails contains all unique addresses.
これで、一意でないレコードについて心配することなく、これらをテーブルに挿入できます。
PHP の方法で状況を処理することをお勧めします。
重複が必要ない場合、なぜデータベースに不要なデータを詰め込む必要があるのでしょうか?
それに加えて、すでにテーブルにはいくつかの冗長なレコードが含まれています。したがって、フィルタリングせずに冗長なレコードを入力するたびに、テーブルのサイズが大きくなり、select distinct
操作がより複雑になります。したがって、レコードがデータベースに挿入される前に、サーバー側自体でレコードの冗長性を処理する方が確実に優れています。
また、指定された方法は両方ともtime-complex
作成しない方がよいためspace-complex
です。
次の方法の方がコストがかかりません: すべての電子メール アドレスを PHP 配列にロードして実行します
array_unique()
。
それぞれの長さ20,000
が char のランダムな文字列と見なされます。10
(これらの20,000
ランダムな文字列に16,384
は、一意の文字列があります)
Test #1 :
20,000
これらのランダムな文字列
で配列を宣言しました上記の配列で実行しました
実行時間:
39604568481秒array_unique
0.141
Test #2 :
20,000
これらのランダム文字列
で配列を宣言PDO 準備済みステートメントを使用してデータベース テーブルにランダム文字列を
挿入テーブル
から DISTINCT ランダム文字列を取得
実行時間: 27002525 秒20,000
735.758
user-end
情報がサーバーに送信される前であっても、 (Javascript などを使用して) テキストエリアから重複を削除することができます。
次に、array_unique
onserver-end
を使用して、重複がないことを確認することもできます。