我的任务是编写一个函数intCounter($ array,$ countZeroes = true)。 我的回声必须显示'数组有4个整数', 如果$ countZeroes为' false',则显示'数组有1个整数'。
$array =
[
1111,
'D',
0,
0,
0
];
function intCounter($array, $countZeroes = true){
}
答案 0 :(得分:0)
我们可以使用array_filter来丢弃我们不想要的项目:
<?php
$things =
[
1111,
'D',
0,
0,
0
];
$integers = array_filter($things, 'is_int');
$non_zero_integers = array_filter($integers);
var_dump($integers);
var_dump($non_zero_integers);
printf("Integers: %s\n", implode($integers, ','));
输出:
array (size=4)
0 => int 1111
2 => int 0
3 => int 0
4 => int 0
array (size=1)
0 => int 1111
Integers: 1111,0,0,0
或者写下自己的条件:
$positive_naturals = array_filter($things, function($v) {
return is_int($v) && $v > 0;
});
要计算0个值:
print array_count_values($things)[0];
输出:
3
答案 1 :(得分:0)
有很多选择可以做到!
例如,您可以通过循环计数来实现:
function intCounter1($array, $countZeroes = true) {
$count = 0;
foreach ($array as $key => $value) {
if (is_int($value) && ($countZeroes || $value != 0)) {
$count++;
}
}
return $count;
}
或者通过过滤数组
function intCounter2($array, $countZeroes = true) {
$array = array_filter($array, function ($value) {
return (is_int($value));
});
if (!$countZeroes) {
$array = array_filter($array, function ($value) {
return ($value != 0);
});
}
return count($array);
}
就我个人而言,最简单的解决方案更好......
答案 2 :(得分:0)
您的问题(无论您是否意识到)实际上不清楚/过于宽泛,因为有很多方法可以解决这个问题以及您认为有效的价值(&#34;守护者&#34;)基于类型将决定采用正确的方法。
以下是您可能考虑调用的一些相关功能。您需要考虑这些方法的后果,并在intCounter()
函数的开头执行一个简单的if语句来指示哪种方法将提供所需的输出。
代码:(Demo)
function retainNumbers($array,$allow_zeros=true){
echo "This is using array_filter's default behavior:\n";
var_export(array_filter($array));
echo "\nThis is array_filter() using is_int():\n";
var_export(array_filter($array,'is_int'));
echo "\nThis is array_filter() using is_numeric():\n";
var_export(array_filter($array,'is_numeric'));
echo "\nThis is array_filter() using is_integer():\n";
var_export(array_filter($array,'is_integer'));
echo "\nThis is array_filter() using ctype_digit():\n";
var_export(array_filter($array,'ctype_digit'));
echo "\nThis is preg_grep() with a pattern matching numbers only:\n";
var_export(preg_grep('/^\d+$/',$array));
echo "\nThis is preg_grep() with a pattern matching numbers that are not zero:\n";
var_export(preg_grep('/^[1-9]\d*$/',$array));
}
$array=[1111,-1,'D','','0',10,0,null,.5];
retainNumbers($array);
输出:
This is using array_filter's default behavior:
array (
0 => 1111,
1 => -1,
2 => 'D',
5 => 10,
8 => 0.5,
)
This is array_filter() using is_int():
array (
0 => 1111,
1 => -1,
5 => 10,
6 => 0,
)
This is array_filter() using is_numeric():
array (
0 => 1111,
1 => -1,
4 => '0',
5 => 10,
6 => 0,
8 => 0.5,
)
This is array_filter() using is_integer():
array (
0 => 1111,
1 => -1,
5 => 10,
6 => 0,
)
This is array_filter() using ctype_digit():
array (
0 => 1111,
4 => '0',
)
This is preg_grep() with a pattern matching numbers only:
array (
0 => 1111,
4 => '0',
5 => 10,
6 => 0,
)
This is preg_grep() with a pattern matching numbers that are not zero:
array (
0 => 1111,
5 => 10,
)
甚至可能没有单个php函数会过滤掉你想要的所有值。在这种情况下,您将必须制作一个由两部分组成的条件过滤器。 (再一次,我不能自信地把这个用勺子喂给你,因为你的问题不清楚要保留什么。)
可能看起来像这样:
function retainNumbers($array,$allow_zeros=true){
// return preg_grep($allow_zeros?'/^\d+$/':'/^[1-9]\d*$/',$array); or...
if($allow_zeros){
return array_filter($array,'is_int');
}else{
return array_filter($array,function($v){return is_int($v) && $v>0;});
}
}
$array=[1111,-1,'D','','0',10,0,null,.5];
//var_export(retainNumbers($array));
var_export(retainNumbers($array,false)); // how to call with no zeros
答案 3 :(得分:-1)
循环并使用带有0(int值)的array_search作为指针。如果我们找到匹配项,我们可以使用返回的键取消设置元素。
如果数组值为0(零),它将匹配,如果它是一个字符串,如'A',则与int相比,它将自动转换为int(0)并匹配。
这将保留非零整数(来自您的示例输入)。
<?php
$array =
[
1111,
'D',
0,
0,
0,
];
while(true) {
$key = array_search(0, $array);
if ($key === false) break;
unset($array[$key]);
}
var_dump(count($array)); // How many integers in array.
var_dump($array);
输出:
int 1
array (size=1)
0 => int 1111