根据值迭代到数组的一部分的最佳方法?

时间:2013-08-27 19:45:33

标签: php arrays performance loops search

我有一个像这样的php数组:

$students = array(
  array(1, 'James', 'Brown', 10, 50),
  array(2, 'John', 'Doe', 10, 40),
  array(3, 'Adam', 'Works', 10, 40));

列表示id,名字,姓氏,类别和级别。例如,我使用三行......在实践中我使用了更多行。

现在我需要根据列(类别或级别)和特定值对结果进行分组打印。例如,我想打印(回声)类别10中的所有学生。我可以遍历每个记录并检查类别;如果10然后打印。这同样适用于40级。再次循环整个组并检查水平;如果40然后打印。

关注性能,是否有更聪明的方法来实现这一目标?例如,首先排序还是过滤?

我可以选择多次查询数据库,但我怀疑这是否是最好的方法。我想操纵阵列会更好。

感谢您的支持!

1 个答案:

答案 0 :(得分:0)

最直接的方法是使用array_filter()函数。但是,如果这些值来自数据库,那么您最好不要编写更好的查询。

$ cat array-filter.php
<?php
$students = array(
  array(1, 'James', 'Brown', 10, 50),
  array(2, 'John', 'Doe', 10, 40),
  array(3, 'Adam', 'Works', 10, 40));

$level_40 = array_filter($students, function($a) {return $a[4]==40 ? true : false;});
print_r($level_40);
?>

$ php array-filter.php
Array
(
    [1] => Array
        (
            [0] => 2
            [1] => John
            [2] => Doe
            [3] => 10
            [4] => 40
        )

    [2] => Array
        (
            [0] => 3
            [1] => Adam
            [2] => Works
            [3] => 10
            [4] => 40
        )

)

回调函数只是将第五列与整数文字40进行比较。第五列的索引为4,而不是5,因此表达式为$a[4]==40 ?

如果您从数据库中获取此数据,那么您最好还是编写更好的SQL。为了让所有级别为40的学生,你会写一些像

这样的东西
select *
from students
where level = 40
order by student_id;

结果集将包含完全正确的行,因此您无需过滤它们。并且它们将按照正确的顺序排列,因此您无需对它们进行排序。