整数计数器功能

时间:2017-09-04 19:52:39

标签: php arrays

我的任务是编写一个函数intCounter($ array,$ countZeroes = true)。 我的回声必须显示'数组有4个整数', 如果$ countZeroes为' false',则显示'数组有1个整数'。

$array = 
[ 
  1111,
  'D',     
   0,     
   0,     
   0 
];

function intCounter($array, $countZeroes = true){

}

4 个答案:

答案 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