我有一个像这样的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然后打印。
关注性能,是否有更聪明的方法来实现这一目标?例如,首先排序还是过滤?
我可以选择多次查询数据库,但我怀疑这是否是最好的方法。我想操纵阵列会更好。
感谢您的支持!
答案 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;
结果集将包含完全正确的行,因此您无需过滤它们。并且它们将按照正确的顺序排列,因此您无需对它们进行排序。