**编辑:
我试图显示数组中以“ P”,“ M”和“ D”开头的键的数目。我想我应该使用array_maps并有一些运气,但现在我陷入困境并尝试浏览手册,在这里和w3schools都没有运气。
我在本地服务器上使用带有XAMPP的PHP 5.6.36版本。我已经尝试过使用array_maps了,我认为这是可以使用的正确命令,但是我只是无法理解如何正确使用它。我已经看过手册,在这里看过,在youtube和W3Schools上都没有运气。有人可以帮忙吗?
我有这个数组:
$tasks = array
(
0 => 'P1',
1 => 'M1',
2 => 'D1',
3 => 'P2',
4 => 'D2'
);
我希望它显示此内容:
Array
(
[P] => 2
[M] => 1
[D] => 2
)
看看它如何巧妙地返回P的M和D的数量?
据我了解,解决方案代码应如下所示:
$array2 = array_map(function(???????){
return ??????????;
}, $tasks);
$array2a = (array_count_values($array2));
echo "<pre>"; print_r($array2a); echo "</pre>";
请帮助?!
答案 0 :(得分:0)
您可以按以下方式使用array_map
:
$tasks = array
(
0 => 'P1',
1 => 'M1',
2 => 'D1',
3 => 'P2',
4 => 'D2'
);
$charsToCheck = array('P','M','D');
$result = array_map(function($v) use ($charsToCheck){
if(in_array(substr( $v, 0, 1),$charsToCheck))
return substr( $v, 0, 1);
}, $tasks);
print_r(array_count_values($result));
结果:-
Array
(
[P] => 2
[M] => 1
[D] => 2
)
答案 1 :(得分:0)
函数array_map()
从每个输入元素创建一个输出元素。既然您不想要它,那是错误的工具。达到目标的最简单方法可能是使用一个简单的循环。但是,如果事情变得更复杂,则扩展性可能会不好。在这种情况下,array_reduce()
可能会派上用场:
$input = [
0 => 'P1',
1 => 'M1',
2 => 'D1',
3 => 'P2',
4 => 'D2',
];
$frequency = array_reduce(
$input,
function ($carry, $item) {
$initial = substr($item, 0, 1);
if (array_key_exists($initial, $carry)) {
$carry[$initial] += 1;
}
return $carry;
},
[
'P' => 0,
'M' => 0,
'D' => 0,
]
);
echo json_encode($frequency, JSON_PRETTY_PRINT) . PHP_EOL;
这样做的目的在于,它定义了使用单个元素($item
)的操作以及如何在单个函数中修改结果状态($carry
),从而使这一部分远离迭代部分。由于这避免了可变状态,因此也可以将其视为一种功能(如“功能编程”中的方法)。
答案 2 :(得分:-1)
您不能为此使用array_map ...我可以使用reduce,但这是一种快速简便的方法...基本上,您可以创建新数组并根据任务数组的第一个字母进行计数。>
$list = new Array();
foreach($tasks as $task){
if($list[$task{0}]){
$list[$task{0}]++;
}else{
$list[$task{0}] = 1;
}
}
array_map带来的问题是,它总是会以1:1的比例生成数组,这不是您想要的...
(很抱歉,如果使用的是糟糕的PHP,已经有很长一段时间了...)
编辑:
使用您已编辑的问题,这是您可能的用法:
$array2 = array_map(function($val){
return $val{0};
}, $tasks);
两个答案的关键是$ var {0}部分,它提取索引0处的字符...