0

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

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

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

谢谢你的支持!

4

1 回答 1

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;

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

于 2013-08-27T20:36:42.237 回答