Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/244.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 我想不出我遇到的这个数组映射问题_Php - Fatal编程技术网

Php 我想不出我遇到的这个数组映射问题

Php 我想不出我遇到的这个数组映射问题,php,Php,**编辑: 我试图显示数组中以“p”、“M”和“D”开头的键数。我想我应该使用array_maps,并有一些运气,但我现在被卡住了,试图在这里和w3schools上查看手册,但没有运气 我在本地服务器上使用带有XAMPP的PHP版本5.6.36。我尝试过使用array_maps,我认为这是正确的命令,但我就是不知道如何正确使用它。我读过它的手册,在这里看了看,在youtube上看了看,没有运气。有人能帮忙吗 我有这个阵列: $tasks = array ( 0 => 'P1',

**编辑:

我试图显示数组中以“p”、“M”和“D”开头的键数。我想我应该使用array_maps,并有一些运气,但我现在被卡住了,试图在这里和w3schools上查看手册,但没有运气


我在本地服务器上使用带有XAMPP的PHP版本5.6.36。我尝试过使用array_maps,我认为这是正确的命令,但我就是不知道如何正确使用它。我读过它的手册,在这里看了看,在youtube上看了看,没有运气。有人能帮忙吗

我有这个阵列:

$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>";
$array2=数组映射(函数(???){
返回??????????;
}(三),;
$array2a=(数组计数值($array2));
回声“;打印(array2a);回声“;

请帮忙

您不能使用数组\u映射进行此操作。。。我想你可以使用reduce,但这里有一个快速简单的方法。。。基本上,您可以创建新数组,并根据任务数组的第一个字母进行计数

$array2 = array_map(function($val){
    return $val{0};
}, $tasks);
使用array_map会遇到的问题是,它总是会生成数组的1:1比率,这不是您想要的

(抱歉,如果是坏的PHP,那么它已经过时了…)

编辑:

使用您编辑的问题,以下是您可能的用法:

$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));

这两个答案的关键是$var{0}部分,它提取索引0处的字符…

您可以使用
数组映射
,如下所示:

Array
(
 [P] => 2
 [M] => 1
 [D] => 2
) 
结果:-

$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;

函数
array_map()
从每个输入元素创建一个输出元素。既然你不想要它,那它就错了。可能实现目标最简单的方法就是使用一个简单的循环。然而,如果事情变得更复杂,这可能无法很好地扩展。对于这些情况,
array\u reduce()
可能会派上用场:


这一点是,它定义了如何处理单个元素(
$item
)以及如何在单个函数中修改结果状态(
$carry
),使该部分远离迭代部分。由于这避免了可变状态,因此也可以将其视为一种函数式(如“函数式编程”)方法。

这可能与
['group']
???是的,问题很好,抱歉。我使用了一篇现有文章中的代码片段(与我的问题不太相关)来了解这个函数是如何工作的,现在我已经到了它工作的时候了,它就在那里,但如果我删除它就不会了。通常我可以根据我需要如何使用它来编写代码片段,但这一条让我很为难!请提取一个!你的问题实际上被认为是离题的。作为这里的一个新用户,也请阅读本文。谢谢@UlrichEckhardt,我已经进行了相应的编辑。我希望这现在更有意义!您不能使用数组_映射进行此????男人怎么样???检查我的答案。@RakeshJakhar在OP编辑之前,它暗示数组映射的结果将提供最终结果…完美!非常感谢@Rakesh Jakhar!!如果原始数组没有满,例如:数组([1]=> p [1 ]=m [ 2 ]=> [3 ]=> [4 ]=>它仍然有效,但我得到“ARAYAY-CONTUTVALUESE()):只能计算字符串和整数值!“我可以在数据库中的空白字段中输入一个”-“但是这会使我的代码的其余部分混乱。是否可以在其中添加if语句来检查键是否为null或类似的内容?@PaulCullis使用array_filter()删除空元素你真是个天才。非常感谢。
$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;