从数组中移除仅包含数字的元素 - PHP

3
我有一个像这样的数组
array(
      1=>hello,
      2=>foo,
      3=>192,
      4=>keep characters AND digits like a1e2r5,
);

我想做的是删除只包含数字(3=>192)的行,并返回这样一个数组:
array(
      1=>hello,
      2=>foo,
      3=>keep characters AND digits like a1e2r5,
);

我尝试使用array_filter,但没有成功。有人可以向我展示如何做吗?谢谢。

4个回答

12
$data = array( 1 => "hello", 
               2 => "foo", 
               3 => "192", 
               4 => "keep characters AND digits like a1e2r5", 
             );

$result = array_filter( $data, 
                        function($arrayEntry) { 
                            return !is_numeric($arrayEntry);
                        }
                      );

或者使用稍微现代一点的PHP,使用箭头函数:

$result = array_filter( $data, 
                        fn($arrayEntry) => !is_numeric($arrayEntry)
                      );

1
使用这个解决方案时要小心。它会删除只有数字的行,但不会相应地调整任何数值索引。当然,如果这正是你想要的,那就算了。 - Cam
如果您确实想要重置数值索引,只需将其包装在对 array_values() 的调用中即可。 - Mark Baker

1
你可以使用循环和intval函数。
$filteredArray = array();
foreach($array as $element){
    //this works because PHP is weakly typed
    if(intval($element) != $element){
        $filteredArray[] = $element;
    }
}

0
你确定你正确地使用了array_filter吗?它是你问题的最佳解决方案。
// named callback for backwards compatibility, but use an anonymous function
// if you have a high enough php version.
function callback($item) { return !is_numeric($item); }

$result = array_filter($a, 'callback');
print_r($result);

// optional - causes numeric keys to be in order
$result = array_values($result);
print_r($result);

使用问题中的示例输入 $a 进行输出:

Array
(
    [1] => hello
    [2] => foo
    [4] => keep characters AND digits like a1e2r5
)

Array
(
    [1] => hello
    [2] => foo
    [3] => keep characters AND digits like a1e2r5
)

0
我很惊讶在任何答案中都没有提到这一点:使用数字测试并不是一个完整的解决方案。如果将它们评估为数字,使用数字测试将删除一些包含非数字字符的元素。具体来说,{e,-,.}。
$data=array(
  1=>'hello',
  2=>'foo',
  3=>'192',
  4=>'keep characters AND digits like a1e2r5',
  5=>'1.4',
  6=>'-42',
  7=>'1e2',
  8=>'1.23e4',
); 
function callback1($arrayEntry) { 
    return !is_numeric($arrayEntry);
}
$result = array_filter( $data, 'callback1');

echo '<pre>';
print_r($result);

echo '<hr>';
function callback2($arrayEntry) { 
    return !preg_match('/^[0-9]+$/', $arrayEntry);
}
$result = array_filter( $data, 'callback2');
print_r($result);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接