Php 带元件修改的阵列滤波器
我试图从用户将定义的字符串中创建一个干净的数组。 字符串可能包含无效ID、空格等。我正在使用Php 带元件修改的阵列滤波器,php,array-filter,Php,Array Filter,我试图从用户将定义的字符串中创建一个干净的数组。 字符串可能包含无效ID、空格等。我正在使用数组\u过滤器的回调函数中的值对象检查元素 $definedIds = "123,1234,1243, 12434 , asdf"; //from users panel $validIds = array_map( 'trim', array_filter( explode(",", $definedIds), function ($i) {
数组\u过滤器的回调函数中的值对象检查元素
$definedIds = "123,1234,1243, 12434 , asdf"; //from users panel
$validIds = array_map(
'trim',
array_filter(
explode(",", $definedIds),
function ($i) {
try {
new Id(trim($i));
return true;
} catch (\Exception $e) {
return false;
}
}
)
);
这很好,但我正在应用trim
两次。是否有更好的方法来实现这一点,或者使用不同的PHP函数来修改元素,然后再将其保留在返回的数组中
注意:我也可以在array\u filter
的第一个参数中调用array\u map
,但无论如何我会在数组中循环两次。这取决于您是否关心性能。如果这样做,则不要使用map+filter,而是使用普通for循环并在适当的位置操纵数组:
$arr = explode(',', $input);
for($i=count($arr)-1; $i>=0; $i--) {
// make this return trimmed string, or false,
// and have it trim the input instead of doing
// that upfront before passing it into the function.
$v = $arr[$i] = Id.makeValid($arr[$i]);
// weed out invalid ids
if ($v === false) {
array_splice($arr, $i, 1);
}
}
// at this point, $arr only contains valid, cleaned ids
当然,如果这是无关紧要的代码,那么修剪两次实际上不会对性能产生影响,但您仍然可以清理:
$arr = explode(',', $input);
$arr = array_filter(
array_map('Id.isValidId', $arr),
function ($i) {
return $i !== false;
}
);
在本例中,我们首先使用该函数进行映射,因此我们得到一个ID数组和false
值,然后对其进行过滤,从而丢弃false
的所有内容,而不是首先过滤,然后进行映射
(在这两种情况下,负责检查有效性的代码都在Id
类中,它要么返回一个清理过的Id,要么返回false
)实际上,您可以用不同的方法来做,但如果我是您,我会这样做。这里我只使用了一个修剪
<?php
$definedIds = "123,1234,1243, 12434 , asdf"; //from users panel
function my_filter($b){
if(is_numeric($b)){
return true;
}
}
print '<pre>';
$trimmed = array_map('trim',explode(',',$definedIds));
print_r(array_filter($trimmed,my_filter));
print '</pre>';
?>
DEMO:作为一个小建议,不要让构造函数抛出,而是使用一个可以调用的静态定义的Id.isValidId(input)
,这样就不需要进行内存分配、符号表修改和垃圾收集。您没有对正在创建的Id
对象执行任何操作,因此,如果您使用它只是为了检查Id是否有效,请将其设置为可以调用的专用函数。您的预期输出是什么?为什么不使用stru replace
在映射数组之前删除空格?@BeingSunny它是[1231231234124312434]@mim。对于这种特殊情况,这是一个好主意,但是仍然想知道是否有一个函数使用回调来填充返回的数组。这是我问题的相同代码,您刚刚命名了回调函数并删除了值对象检查…@CarlosAS:P是的,您是ri8,我只是不自觉地发布了与您已经发布的相同的逻辑。现在查看我的编辑我只在数组_map()内使用了一次修剪
Array
(
[0] => 123
[1] => 1234
[2] => 1243
[3] => 12434
)