0

何らかの理由で、私はソートされたphp配列を持っています:

"$arr_questions" = Array [6]    
    0   Array [6]   
    1   Array [6]   
    2   Array [6]   
    3   Array [6]   
    4   Array [6]   
    5   Array [6]   

それぞれの位置は別の配列です。今回は連想的です。位置[0]を参照してください。

0 = Array [6]   
    question_id 40  
    question    La tercera pregunta del mundo   
    explanation 
    choices Array [3]   
    correct 0   
    answer  1   

配列をループせずに、そのプロパティの1つを知っているだけで、この位置0に直接アクセスする方法はありますか?

例...「question_id」プロパティが40である配列の位置のプロパティを変更する必要があると想像してください。それが私が知っている唯一のプロパティです。question_idプロパティが1番目と2番目のどちらの位置にあるのか、またはどちらの位置にあるのかわかりません。そして、たとえば、「answer」プロパティを2に変更したいとします。

配列全体をループせずに、その位置に直接アクセスするにはどうすればよいですか。つまり...私はこれをしたくない:

foreach ($arr_questions as $question){
  if ($question["question_id"] == 40){
    $question["answer"] == 2;
  }
}
4

3 に答える 3

1

PHP配列を使用すると、IDによってランダムな値にアクセスできます。

他の言語では配列インデックスは常に整数でなければならないため、これは実際には大きな問題です。ただし、PHP配列は、ほとんどの場合、他の言語の辞書と同じように機能します。この辞書では、キーを文字列などの他のデータ型にすることができます。

それによって、いくつかの質問にアクセスできるようにしたい場合で、IDがわかっている場合は、question_idを各配列エントリのインデックスにして配列を作成する必要があります。

それができない場合でも、慌てる必要はありません。結局、あなたはある種の検索をしなければならないでしょう、それは本当です。しかしねえ、あなたは2つのケースがあります:

  • a)配列が大きい。その場合は、マージソートやクイックソートなどの最適化された並べ替えアルゴリズムを実行して、データをすばやく並べ替えて、目的のフィールドで既に並べ替えることができるようにする必要があります。
  • b)アレイはそれほど大きくありません。その場合、それは大したことではないと思います。並べ替えによってアプリケーションの速度が必要以上に遅くなる可能性があります。より速くしたい場合は、質問の並べ替え(可能な場合)または配列構造のリファクタリングの結果をキャッシュして、必要なキーを配列インデックスとして使用します。

ちなみに、CPU時間やRAMスペースの浪費を避けてマップすることはできません。通常、一方を他方に交換することができます。つまり、question_idでインデックス付けされた配列を1つだけ格納する場合は、O(1)+ O(array-access)時間でquestion_idを検索できます。O(array-access)が定数の場合、O(1)で処理を実行できます。それは一定の時間を意味し、それはそれが得ることができるのと同じくらい速いです。

ただし、他の種類の検索が必要な場合は、O(n * log(n))またはO(n²)の時間計算量になる可能性があります。

ただし、必要な順序付けの方法で必要な数の配列を格納していた場合、各配列にアクセスするのに必要な時間はO(1)時間だけです。ただし、O(n)スペースが必要になります(ここでnは、直接アクセスできる機能の数です)。

これにより、アレイを構築する時間が(定数によって)増加します。

于 2012-09-15T12:58:12.173 に答える
0

いいえ、配列をループせずにその要素にアクセスする方法はありません。ただし、その検索をヘルパー関数に抽象化することもできます。

于 2012-09-15T12:36:47.060 に答える
0

あなたの状況では、ループなしでは不可能ですが、配列構造を次のように変更すると、次のようになります。

array(
    39 => array(...), 
    40 => array(...)
)

39と40のどちらがあなたのものquestion_idであるか、そしてあなたはループなしでそれらにとても速くアクセスすることができます。

その構造を維持したい、または維持する必要がある場合は、配列を検索して見つかったインデックスを返すパラメータとして、、、およびを取得する関数を作成するだけで、arrayこのassociative indexループvalueを何度も作成する必要はありません。 ..。。

于 2012-09-15T12:38:34.263 に答える