1

現在、array_replaceを使用するときに、foreachを使用してキーを検索しています。

$grades = array(
               0 =>array('id'=>1, 'grade'=>4),
               1 =>array('id'=>5, 'grade'=>2), 
               2 =>array('id'=>17,'grade'=>1),
             )
$replacement = array('id'=>17,'grade'=>3);

foreach($grades as $key=>$grade){
    if($grade->id ==$replacement['id'] )
       $found = $key;
}
$new_grades = array_replace($grades, array($found_key=>$replacement));

$ grades配列で要素の数が増えすぎると、これが非効率になるのではないかと思います。検索と置換の仕事をするためのより良い方法はありますか?

4

2 に答える 2

5

実行時間は、配列内の要素の数()に比例して増加しO(N)ます。より適切なデータ構造を使用します。つまり、IDをインデックスとして関連付けて配列を使用します。

$grades = array(
    1 => array('grade'=>4),
    5 => array('grade'=>2), 
    17 => array('grade'=>1)
);

その場合、ルックアップコストは一定です(O(1)。できるよ:

$grades[$replacement['id']] = array('grade' => $replacement['grade']);

データに応じて、または同様のもの。

于 2012-08-16T14:59:06.410 に答える
4

ええ、それははるかに効率的に行うことができます。

$grades = array(
    1   => 4,
    5   => 2,
    17  => 1,
);
$replacement = array(
    17  => 3,
);
$grades = array_merge($grades, $replacement);

グレードだけでなくIDに関連付けられたより多くの情報が必要な場合でも、FelixKlingのようなより複雑なデータ構造が必要になります。しかし、そのような要件はあなたの質問には存在しないので、私はそれを想定していません。

于 2012-08-16T14:59:06.427 に答える