过滤数组以获取以自定义选定字符开头的值

Ada*_*iss 4 php arrays

我有一个快速:)

我有一个由字符串值组成的基于null的数组:

array
  0 => string 'Message 1' (length=9)
  1 => string '%company' (length=8)
  2 => string 'Message 2' (length=9)
  3 => string '%name' (length=5)
Run Code Online (Sandbox Code Playgroud)

我需要选择所有值,%并将它们理想地放入另一个数组中.

array
  0 => string 'Message 1' (length=9)
  1 => string 'Message 2' (length=9)

array
  0 => string '%company' (length=8)
  1 => string '%name' (length=5)
Run Code Online (Sandbox Code Playgroud)

谢谢!

对于任何感兴趣的人,第一个数组是验证函数的结果,因为我讨厌,当验证器返回有关百万行所需输入的信息时(例如:这<br><br>是必需的......),而不是输出实际消息,我输出必填和未填充输入的名称,将被放入一条好消息中"填写此字段,即使是必填项":)

Miniedit:即使是有关stackoverflow上的答案的问题链接,也会感激不尽:)

kap*_*apa 17

PHP> 5.3,下面你需要使用create_function().

此解决方案首先过滤原始数组,并获取以该开头的项目%.然后使用array_diff()来获取具有剩余值的数组.

$array_percent = array_filter($orig_array, function ($v) {
  return substr($v, 0, 1) === '%';
});

$array_others = array_diff($orig_array, $array_percent);
Run Code Online (Sandbox Code Playgroud)

  • 非常优雅!:) (2认同)

sal*_*the 7

对于复活的问题道歉,但这样简单的过滤是超级简单preg_grep().

$subject  = array('Message 1', '%company', 'Message 2', '%name');

$percents = preg_grep('/^%/', $subject);
$others   = preg_grep('/^%/', $subject, PREG_GREP_INVERT); 

var_dump($percents, $others);
Run Code Online (Sandbox Code Playgroud)


Ste*_*rig 5

这是一些使用简单分区代码array_walk()和匿名回调.

$result1 = array();
$result2 = array();
array_walk($array, function($v) use (&$result1, &$result2) {
    if ($v[0] == '%') {
        $result1[] = $v;
    } else {
        $result2[] = $v;
    }
});
Run Code Online (Sandbox Code Playgroud)

将其放入一些可重用的代码中:

function partition($array, $callback) {
    $resultTrue  = array();
    $resultFalse = array();
    array_walk($array, function($v) use (&$resultTrue, &$resultFalse, $callback) {
        if (call_user_func($callback, $v) === true) {
            $resultTrue[] = $v;
        } else {
            $resultFalse[] = $v;
        }
    });
    return array($resultTrue, $resultFalse);
}

// and put to use:
$partitionedData = partition($array, function($v) {
    return $v[0] == '%';
});
Run Code Online (Sandbox Code Playgroud)