Php is_integer возвращает true в строковое значение - PullRequest
0 голосов
/ 27 сентября 2019

Я пытаюсь выяснить, почему не сбрасывается последний элемент.

<?php
class Filter
{
    public static function filterNumbersFromArray(&$arr)
    {
        $i = 0;
        while($i < count($arr)){
            if(is_integer($arr[$i]) === false){
                unset($arr[$i]);
            }
            $i++;
        }
    }
}
$arr = [1, 'a', 'b', 2 , 'bb'];
Filter::filterNumbersFromArray($arr);
print_r(array_values($arr));

Получается вывод:

Array ([0] => 1[1] => 2 [2] => bb)

Ответы [ 7 ]

1 голос
/ 27 сентября 2019

Использовать встроенную функцию array_filter с is_int

$filtered = array_filter($array, 'is_int');
$filtered = array_filter($array, 'is_numeric');
$filtered = array_filter($array, 'ctype_digit');
1 голос
/ 27 сентября 2019

сокращенный способ - использовать array_filter

$arr = [1, 'a', 'b', 2 , 'bb'];

$res = array_filter($arr, 'is_integer');

print_r($res);

Результат

1 голос
/ 27 сентября 2019

Ваша проблема в том, что сброс значений в цикле приводит к изменению count массива массива, и поэтому вы никогда не смотрите на $arr[4], чтобы решить, следует ли сбрасывать его.Предварительно вычислите count и ваш цикл будет работать:

public static function filterNumbersFromArray(&$arr)
{
    $i = 0;
    $c = count($arr);
    while ($i < $c) {
        if(is_integer($arr[$i]) === false){
            unset($arr[$i]);
        }
        $i++;
    }
}

Вывод:

Array
(
    [0] => 1
    [1] => 2
)

Демонстрация на 3v4l.org

1 голос
/ 27 сентября 2019

Попробуйте это ..

class Filter
{
public static function filterNumbersFromArray($arr)
{
    $res = [];
    foreach($arr as $ar)
    {
      if(is_integer($ar))
      $res[] = $ar;
    }
    return $res;
}
}

$arr = [1, 'a', 'b', 2 , 'bb'];
$array = Filter::filterNumbersFromArray($arr);
print_r(array_values($array));
0 голосов
/ 27 сентября 2019

Попробуйте:

Решение

<?php
class Filter
{
    public static function filterNumbersFromArray(&$arr) {

        $ints = [];
        foreach($arr as $index) { //Loop through array and add to resultset if int
            if (is_integer($index)) {
                $ints[] = $index;
            }
        }
        return $ints;
    }

}

$filter = Filter::filterNumbersFromArray([1, 'a', 'b', 2 , 'bb']); //Store new array
print_r(array_values($filter));

Результат:

Array ( [0] => 1 [1] => 2 )
0 голосов
/ 27 сентября 2019

Попробуй это.Работает, создавая новый массив, если значение is_int.

class Filter
{
    public static function filterNumbersFromArray(&$arr)
    {
        $i = 0;
        while($i < count($arr)){
            if(is_int($arr[$i])){
               $newarr[] = $arr[$i];
                // unset($arr[$i]);
            }
            $i++;
        }
    }
}
$arr = [1, 'a', 'b', 2 , 'bb'];
Filter::filterNumbersFromArray($arr);
print_r(array_values($newarr));

Вывод:

Array ( [0] => 1 [1] => 2 )
0 голосов
/ 27 сентября 2019

Ваше значение приведено к int внутри is_integer(), думаю, вы ищете is_numeric().

...