我无法弄清楚我遇到的这个array_map问题

时间:2019-04-08 16:40:39

标签: php

**编辑:

我试图显示数组中以“ 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>";

请帮助?!

3 个答案:

答案 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处的字符...