0

私は2つの配列を持っています:

最初:

$array1 = ("Key 1","Key 2","Key 3"); //is dynamic, so can range from 1 => many values

2 番目の配列はデータベース化された値で、プレーヤーがインベントリに持っているキーの数に基づいて配列を返します。

$array2 = ("Key 1","Key 1","Key 2","Key 3","Key 3","Key 3") //in this case, the player DOES have all the keys.

私の問題は、これらの配列を比較し$array2て、$array1.

私が試した私の比較コード..

$check = array();
while ($k = mysql_fetch_array($array2)) {
    foreach ($array1 as $name) {
    if ((string)$name == (string)$k['name']) $check[] = true;
    else $check[] = false;
    }
}
foreach ($check as $bool) {
    if ($bool == false) {
        $return = false;
    } else {
    $return = true;
    }
}
return $return;

問題はprint_r($check)、 I のときに多数の false が返されるため、プレーヤーに正しいキーがすべて含まれている場合でも、オフの比較によってコードが壊れ、false が返されることです。

この比較ロジックに関するヘルプは素晴らしいものです。詳細が必要な場合はお知らせください。

4

2 に答える 2

0

これに対する答えは、これがin_array()私がそれを解決するために使用したアルゴリズムです(皆さんの助けに感謝します)

while ($k = mysql_fetch_array($pkey)) { //turn returned list of player items into a new array
    $new_pkey[] = $k['name'];
}
foreach ($key as $name) { //search new array using the set list required to pass the check
    if (in_array($name,$new_pkey)) $check[] = true;
    else $check[] = false;
}
foreach ($check as $bool) { //search the check array to see if it contains a false. If so, break and return false
    if ($bool == false) {
        $return = false;
        break; //crucial bug -- would return true unless the last element was false. This lets any element be false and finally yield false
    } else {
        $return = true;
    }
}
return $return;
于 2013-01-02T10:15:22.777 に答える
0

あなたの元の論理は良いことです。あなたは2つの間違いを犯しました:

  1. true 条件に遭遇したときにループから抜け出すのを忘れたため、ループが続行され、次の反復で $check が false に設定され、$check の不要な肥大化が発生します。
  2. 時期尚早に $check を false に設定しました。将来の一致条件では、配列内の別の場所でビットが反転しますが、以前の不一致では、ビットが既に false に設定されています。

これを試して:

<?php

$check = array();
foreach ($array1 as $name) {
    $check[$name] = false;
}

while ($k = mysql_fetch_array($array2)) {
    foreach ($array1 as $name) {
    if ((string)$name == (string)$k['name'])
    {
        $check[$name] = true;
        break;
    }
    }
}
foreach ($check as $bool) {
    if ($bool == false) {
    $return = false;
    } else {
    $return = true;
    }
}
return $return;
?>

そして、いくつかの最適化も行うことができます。DB から読み取った各値を $array1 の各値と比較する代わりに、$check 配列に false があるキーに対してのみ値をチェックできます。$check に true を入力し始めると、内部ループは非常に高速に実行されます。

または、内側のループが長い場合は、ソートして検索を高速化することを検討できます。バイナリ検索機能が組み込まれていないか、PHP にバイナリ検索機能が組み込まれていません。おそらくどこかから切り取って貼り付ける必要があります。

または、最適化しない場合は、少なくとも 'in_array' などの関数を 1 回呼び出して内部ループをなくしてください。

于 2013-01-02T10:16:03.550 に答える