PHP 配列 Intersection の最適化されたコード分析_PHP チュートリアル

WBOY
リリース: 2016-07-21 15:31:13
オリジナル
847 人が閲覧しました

ただし、携帯電話には多くのパラメータがあり、携帯電話ごとにパラメータが大きく異なるため、パラメータ テーブルの構造は通常、水平テーブル (1 パラメータが 1 列) ではなく、垂直テーブル (1 パラメータが 1 行) になります。 、結果を取得するために複数のパラメータが使用されます。通常は、それぞれのパラメータを取得して結果を取得し、共通部分を取得します。
各パラメーターに約 1,000 個の一意の結果 (id int) が含まれると仮定し、これを前提としてデータの生成をシミュレートします:

コードをコピーします コードは次のとおりです:

$rand = function() {
$result = array();
for ($i = 0; $i <1000; null) {
$value = mt_rand(1, 10000); ($result[$value])) {
$result[$value] = null;
}
$param_a = $rand(); param_b = $rand ();
?>


注: テスト データ セットが小さすぎると、結論が一貫性を持たなくなる可能性があります。まず、PHP 組み込みメソッド array_intersect によって達成されるパフォーマンスを見てみましょう。


コードをコピーします
コードは次のとおりです:

$time = microtime(true); $result = array_intersect($param_a, $param_b); ) - $time; echo "array_intersect: {$time} n";
カスタム メソッド intersect によって達成されるパフォーマンスを見てみましょう:



コードは次のとおりです。次のように:


function intersect() {
if (func_num_args () < 2) {
trigger_error('param error', E_USER_ERROR)
} $args = func_get_args(); ($args AS $arg) { if (!is_array($arg)) { trigger_error('param error', E_USER_ERROR) }
}
$intersect = function($a, $b) {
$result = 配列();
$length_a = カウント($a);
$length_b = カウント($b); $i < $length_a && $j < $ length_b; null) {
if($a[$i] < $b[$ j]) {
$i++; else if($a[$i] > $b[$j]) {
$j++;
$result[] = $a[$i];
$j++;
$result($args);
sort($result);
foreach ($arg として $arg);
$result($result, $arg);
return $result; = microtime(true);
$result = intersect($param_a, $param_b);
$time = microtime(true) - $time;


;直感的には、組み込み関数の方がカスタム関数よりも速いと思いますが、この場合の結果は反対です:
array_intersect: 0.023918151855469
intersect: 0.0026049613952637
array_intersect と intersect は完全に同等ではないことを皆さんに思い出していただく必要があります。例は次のとおりです:



コードをコピーします

コードは次のとおりです:


$param_a = array(1, 2, 2);
var_dump(
array_intersect($param_a, $param_b),
intersect($param_a, $param_b)
);


array_intersect: 1, 2, 2
intersect: 1, 2
つまり、最初の配列パラメーターに重複要素がある場合、array_intersect は 1 つだけを返すのではなく、条件を満たすすべての重複要素を返します。興味があれば、読者はパラメーターの順序を変更して結果を確認できます。
もう一度話しましょう。最初に intersect メソッドを書いたとき、おそらく次のようになりました。


コードをコピーします

コードは次のとおりです:

function intersect() { if (func_num_args() < ; 2) { trigger_error('param error', E_USER_ERROR); }
$args = func_get_args() {
if (!is_array($arg) )) {
trigger_error(' param error', E_USER_ERROR);
}
}
$result = array();
$data = array_count_values(
call_user_func_array('array_merge', $args)
); AS $value => $ count) {
if ($count > 1) {
$result[] = $value;
}
return $result;
コードはより簡潔ですが、array_merge を使用するため、配列内の要素が非常に多い場合、逆に占有されるメモリが比較的大きくなります。であれば、この方法も実現可能です。 (出典: Huo Ding のメモ)

www.bkjia.comtru​​ehttp://www.bkjia.com/PHPjc/323093.html技術記事ただし、携帯電話には多くのパラメータがあり、携帯電話ごとにパラメータが大きく異なるため、パラメータ テーブルの構造は通常、水平テーブル (1 パラメータが 1 列) ではなく垂直テーブル (1 パラメータが 1 行) になります...
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート