Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/257.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 带元件修改的阵列滤波器_Php_Array Filter - Fatal编程技术网

Php 带元件修改的阵列滤波器

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) {

我试图从用户将定义的字符串中创建一个干净的数组。 字符串可能包含无效ID、空格等。我正在使用
数组\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
)