我想按用户名查找唯一值:
因此得到的阵列将是[0] =>JakeP, [1]=>TomC
我的代码目前可以工作,但我想知道有没有更好的方法可以用更少的循环或using array_unique
函数来完成这项任务?
Array
(
[0] => Array
(
[ID] => 3
[Username] => TomC
[Project_Name] => Inventory
)
[1] => Array
(
[ID] => 4
[Username] => JakeP
[Project_Name] => Inventory
)
[2] => Array
(
[ID] => 2
[Username] => TomC
[Project_Name] => Stocks
)
[3] => Array
(
[ID] => 1
[Username] => Tomc
[Project_Name] => Stocks
)
)
我的代码是:
$names_filter = array();
foreach($latest_projects as $project)
{
if(empty($names_filter))
{
$names_filter[] = $project['Username'];
}
else {
foreach($names_filter as $key=>$value)
{
if($value == $project['Username'])
{ break; }
else
{
$names_filter[] = $project['Username'];
}
}
}
}
如果您使用的是PHP>=5.5,您可以利用array_column()函数:
$uniqueNames = array_unique(
array_column($myArray, 'Username')
);
在PHP 5.5之前,您可以使用:
$uniqueNames = array_unique(
array_map(
function($value) {
return $value['Username'];
},
$myArray
)
);
您可以使用in_array函数来简化代码。示例:
$names_filter = array();
foreach($latest_projects as $project)
{
if(!in_array($project['Username'], $names_filter))
{
$names_filter[] = $project['Username'];
}
}
in_array()
函数检查数组中是否存在值。因此,如果$names_filter数组不在该数组中,foreach
循环只会将项目用户名添加到该数组中。输出应该是$names_filter数组中唯一用户名的列表。
我们可以循环使用$latest_projects
并将每个用户名存储到新数组($filter
)中。由于数组不能有两个具有相同键的元素,所以如果键存在,它将被覆盖。
$filter = array();
foreach ($latest_projects as $project)
{
$filter[$project['Username']] = 1;
}
$filter = array_keys($filter);
我无法谈论它相对于其他解决方案的性能,但使用array_map和array_unique也可以获得类似的效果。不过,它也没有那么可读,这同样重要。
$uniqueUsers = array_unique(array_map(function ($p) { return $p['Username']; }, $latest_projects));