-3

私はphpに配列を持っています

$arr = array(
    array('id' => 1, 'par' => 5),
    array('id' => 2, 'par' => 5),
    array('id' => 3, 'par' => 5),
    array('id' => 4, 'par' => 7),
    array('id' => 5, 'par' => 7),
    array('id' => 6, 'par' => 7),
    array('id' => 7, 'par' => 9),
    array('id' => 8, 'par' => 9),
    ...
);

プロパティ $arr[x]['par'] == 7 を持つ要素の最初のインデックスを取得するための効果的なアルゴリズムを知っている人はいますか? 2000 個の要素を含む配列から最初の x を取得する方法は?

ありがとうございました

4

2 に答える 2

0

イテレータを使用する方が「手動」で実行するよりも速いかどうかはわかりませんが、RecursiveArrayIteratorを使用できます-http ://php.net/manual/en/class.recursivearrayiterator.php

$arr = array(
    array('id' => 1, 'par' => 5),
    array('id' => 2, 'par' => 5),
    array('id' => 3, 'par' => 5),
    array('id' => 4, 'par' => 7),
    array('id' => 5, 'par' => 7),
    array('id' => 6, 'par' => 7),
    array('id' => 7, 'par' => 9),
    array('id' => 8, 'par' => 9),
);

$arrayIterator = new RecursiveIteratorIterator(new RecursiveArrayIterator($arr));
foreach ($arrayIterator as $subKey=>$subValue) {
        if ($subKey == 'par' && $subValue == 9) {
                $validArray = iterator_to_array($arrayIterator->getSubIterator());
                $id = $validArray['id'];  // This is your return array
                break;
        }
}

しかし、正直に言うと、手作業で行う方がおそらく理解とデバッグがはるかに簡単であり、2000レコードの場合、次のような複雑なものに煩わされるのはなぜですか。

foreach($arr as $subArray) {
    if ($subArray['par'] == 9) {
            $id = $subArray['id'];
            break;
    }
}

より多くのレコードを処理している場合、またはFacebookの人気があった場合は、真剣になり始めます。しかし、時にはそれをシンプルに保つことが最善の方法です。

于 2012-06-11T13:21:58.473 に答える
0

二分探索を使った

$par = 7;
$a = 0;$i = -1;
$b = count($arr);
while(true) {
    if($par == $arr[$a]['par']) { $i = $a; break; }
    if($par == $arr[$m]['par']) { $i = $m; break; }
    if($par == $arr[$b]['par']) { $i = $b; break; }
    if($a == $m || $m == $b) break;
    if($arr[$a]['par'] < $par && $par < $arr[$m]['par']) {
        $b = $m; $m = floor(($a+$b)/2);
    }
    if($arr[$m]['par'] < $parent && $parent < $arr[$b]['par']) {
        $a = $m; $m = floor(($a+$b)/2);
    }
}

その例は、 $i=0;while($i < $n && $arr[$i]['par'] != $par) $i++; よりも遅かったです。代わりに array_search を使用できますか?

于 2012-06-11T13:18:20.280 に答える