php,一些有效的算法

时间:2012-06-11 12:15:19

标签: php arrays algorithm

我在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?

谢谢

2 个答案:

答案 0 :(得分: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更慢;而($ i&lt; $ n&amp;&amp; $ arr [$ i] ['par']!= $ par)$ i ++;可以使用array_search吗?

答案 1 :(得分: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的欢迎,那么就开始变得严肃起来。但有时保持简单是最好的方法。