基于值迭代到数组一部分的最佳方式


Best way to iterate to a part of an array based on value?

我有一个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,则打印。

着眼于性能,有没有更聪明的方法来实现这一点?例如,首先排序还是筛选?

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

感谢您的支持!

最简单的方法是使用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;

结果集将完全包含正确的行,因此不需要对它们进行筛选。它们会按照正确的顺序排列,所以你不需要对它们进行排序。