array_intersect() 在 php 中有二维数组
array_intersect() with 2d arrays in php
我正在尝试过滤满足两个条件的二维数组。但是,它没有按预期工作。我发现错误出在 array_intersect()
函数中。为什么 array_intersect()
无法正常工作 here.Is 还有另一种无需迭代的方法。
<?php
error_reporting(0);
$students = [
["name"=> 'k. l.james', "grade"=>8],
["name"=> 'k. l.james', "grade"=>9],
["name"=> 'e. musk', "grade"=>8],
["name"=> 'jone', "grade"=>9],
];
function filterByGrade($grade){
global $students ;
if (empty($grade)){
return $students ;
}else{
return array_filter($students , function($record) use($grade){
return ($record['grade'] == $grade);
});
}
}
function filterByName($name){
global $students;
if (empty($name)){
return $students;
}else{
return array_filter($students, function($record) use($name){
return (strcasecmp(str_replace(' ','',$record['name']),str_replace(' ','',$name)) == 0);
});
}
}
print_r(filterByGrade(8));
echo "<br/>";
print_r(filterByName('k.l.james'));
echo '<br/>';
print_r(array_intersect(filterByGrade(8), filterByName('k.l.james')));
?>
结果是;
Array ( [0] => Array ( [name] => k. l.james [grade] => 8 ) [2] => Array ( [name] => e. musk [grade] => 8 ) )
Array ( [0] => Array ( [name] => k. l.james [grade] => 8 ) [1] => Array ( [name] => k. l.james [grade] => 9 ) )
Array ( [0] => Array ( [name] => k. l.james [grade] => 8 ) [2] => Array ( [name] => e. musk [grade] => 8 ) )
我希望最后一行结果为,
Array ( [0] => Array ( [name] => k. l.james [grade] => 8 ))
如果我按如下方式交换 array_intersect() 中的两个数组,结果是不同的。
print_r(array_intersect(filterByName('k.l.james'),filterByGrade(8)));
然后,我得到如下结果。
Array ( [0] => Array ( [name] => k. l.james [grade] => 8 ) [2] => Array ( [name] => e. musk [grade] => 8 ) )
Array ( [0] => Array ( [name] => k. l.james [grade] => 8 ) [1] => Array ( [name] => k. l.james [grade] => 9 ) )
Array ( [0] => Array ( [name] => k. l.james [grade] => 8 ) [1] => Array ( [name] => k. l.james [grade] => 9 ) )
我注意到尽管考虑了两个数组的交集,但只打印了 array_intersect()
中的第一个过滤数组。
您可以创建一个函数来使用多个条件来筛选学生,而不是尝试合并 2 个结果。
函数:
/**
* Here, $condition array of keys/values used to filter $data.
* ex: ['name' => 'jone', 'grade' => 9]
*/
function filterArray($data, $conditions)
{
if (empty($conditions)) {
return $data;
}
return array_filter($data, function($record) use ($conditions) {
// Check all given conditions
foreach ($conditions as $key => $value) {
// If doesn't match, return false (don't keep in filtered array)
if ($record[$key] != $value) return false;
}
// conditions passed, add to array
return true;
});
}
用法:
$students = [
["name"=> 'k. l.james', "grade" => 8],
["name"=> 'k. l.james', "grade" => 9],
["name"=> 'e. musk', "grade" => 8],
["name"=> 'jone', "grade" => 9],
];
print_r(filterArray($students, ['grade' => 8]));
// out : [["name"=> 'k. l.james', "grade" => 8],["name"=> 'e. musk', "grade" => 8]]
print_r(filterArray($students, ['name' => 'k. l.james']));
// out : [["name"=> 'k. l.james', "grade" => 8], ["name"=> 'k. l.james', "grade" => 9]]
print_r(filterStudents($students, ['grade' => 8, 'name' => 'k. l.james']));
// out : [["name"=> 'k. l.james', "grade" => 8]]
补充说明:
- 不鼓励使用
global
,在下面的代码中,$students
由函数参数给出。
- 无需在“return 早期”模式 (
if ($someCondition) { return; } else { }
) 之后使用 else
语句。
如果序列化内部数组对象,array_intersect()
功能正常。所以,我通过
得到了正确的结果
print_r(
array_map('unserialize',
array_intersect(
array_map('serialize', filterByName('k.l.james')),
array_map('serialize', filterByGrade(8))
)
)
);
我能知道网站过滤器的效率更高吗,@Syscall的答案或我的方法。
我正在尝试过滤满足两个条件的二维数组。但是,它没有按预期工作。我发现错误出在 array_intersect()
函数中。为什么 array_intersect()
无法正常工作 here.Is 还有另一种无需迭代的方法。
<?php
error_reporting(0);
$students = [
["name"=> 'k. l.james', "grade"=>8],
["name"=> 'k. l.james', "grade"=>9],
["name"=> 'e. musk', "grade"=>8],
["name"=> 'jone', "grade"=>9],
];
function filterByGrade($grade){
global $students ;
if (empty($grade)){
return $students ;
}else{
return array_filter($students , function($record) use($grade){
return ($record['grade'] == $grade);
});
}
}
function filterByName($name){
global $students;
if (empty($name)){
return $students;
}else{
return array_filter($students, function($record) use($name){
return (strcasecmp(str_replace(' ','',$record['name']),str_replace(' ','',$name)) == 0);
});
}
}
print_r(filterByGrade(8));
echo "<br/>";
print_r(filterByName('k.l.james'));
echo '<br/>';
print_r(array_intersect(filterByGrade(8), filterByName('k.l.james')));
?>
结果是;
Array ( [0] => Array ( [name] => k. l.james [grade] => 8 ) [2] => Array ( [name] => e. musk [grade] => 8 ) )
Array ( [0] => Array ( [name] => k. l.james [grade] => 8 ) [1] => Array ( [name] => k. l.james [grade] => 9 ) )
Array ( [0] => Array ( [name] => k. l.james [grade] => 8 ) [2] => Array ( [name] => e. musk [grade] => 8 ) )
我希望最后一行结果为,
Array ( [0] => Array ( [name] => k. l.james [grade] => 8 ))
如果我按如下方式交换 array_intersect() 中的两个数组,结果是不同的。
print_r(array_intersect(filterByName('k.l.james'),filterByGrade(8)));
然后,我得到如下结果。
Array ( [0] => Array ( [name] => k. l.james [grade] => 8 ) [2] => Array ( [name] => e. musk [grade] => 8 ) )
Array ( [0] => Array ( [name] => k. l.james [grade] => 8 ) [1] => Array ( [name] => k. l.james [grade] => 9 ) )
Array ( [0] => Array ( [name] => k. l.james [grade] => 8 ) [1] => Array ( [name] => k. l.james [grade] => 9 ) )
我注意到尽管考虑了两个数组的交集,但只打印了 array_intersect()
中的第一个过滤数组。
您可以创建一个函数来使用多个条件来筛选学生,而不是尝试合并 2 个结果。
函数:
/**
* Here, $condition array of keys/values used to filter $data.
* ex: ['name' => 'jone', 'grade' => 9]
*/
function filterArray($data, $conditions)
{
if (empty($conditions)) {
return $data;
}
return array_filter($data, function($record) use ($conditions) {
// Check all given conditions
foreach ($conditions as $key => $value) {
// If doesn't match, return false (don't keep in filtered array)
if ($record[$key] != $value) return false;
}
// conditions passed, add to array
return true;
});
}
用法:
$students = [
["name"=> 'k. l.james', "grade" => 8],
["name"=> 'k. l.james', "grade" => 9],
["name"=> 'e. musk', "grade" => 8],
["name"=> 'jone', "grade" => 9],
];
print_r(filterArray($students, ['grade' => 8]));
// out : [["name"=> 'k. l.james', "grade" => 8],["name"=> 'e. musk', "grade" => 8]]
print_r(filterArray($students, ['name' => 'k. l.james']));
// out : [["name"=> 'k. l.james', "grade" => 8], ["name"=> 'k. l.james', "grade" => 9]]
print_r(filterStudents($students, ['grade' => 8, 'name' => 'k. l.james']));
// out : [["name"=> 'k. l.james', "grade" => 8]]
补充说明:
- 不鼓励使用
global
,在下面的代码中,$students
由函数参数给出。 - 无需在“return 早期”模式 (
if ($someCondition) { return; } else { }
) 之后使用else
语句。
array_intersect()
功能正常。所以,我通过
print_r(
array_map('unserialize',
array_intersect(
array_map('serialize', filterByName('k.l.james')),
array_map('serialize', filterByGrade(8))
)
)
);
我能知道网站过滤器的效率更高吗,@Syscall的答案或我的方法。