2

我有一个这样的数组

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

4 回答 4

11
$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)
                      );
于 2012-04-08T15:14:34.763 回答
1

您可以使用循环和 intval 函数。

$filteredArray = array();
foreach($array as $element){
    //this works because PHP is weakly typed
    if(intval($element) != $element){
        $filteredArray[] = $element;
    }
}
于 2012-04-08T15:10:07.183 回答
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
)
于 2012-04-08T15:20:39.377 回答
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);
于 2012-04-09T03:50:55.460 回答