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

时间:2011-04-05 07:37:35

标签: php arrays

我快点:)

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

array
  0 => string 'Message 1' (length=9)
  1 => string '%company' (length=8)
  2 => string 'Message 2' (length=9)
  3 => string '%name' (length=5)

我需要选择以%开头的所有值,理想情况下将它们放入另一个数组中。

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

array
  0 => string '%company' (length=8)
  1 => string '%name' (length=5)

谢谢!

对于任何感兴趣的人,第一个数组是验证函数的结果,因为我讨厌,当验证器返回有关百万行所需输入的信息时(例如:这是必需的<br><br> ...),而不是输出真实的消息,我输出必需和未填充输入的名称,将其放入一个很好的消息'字段,这甚至是强制性的':)

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

5 个答案:

答案 0 :(得分:17)

PHP&gt; 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);

答案 1 :(得分:6)

为复活问题而道歉,但像这样的简单过滤是超级简单 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);

答案 2 :(得分:5)

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

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

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

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] == '%';
});

答案 3 :(得分:2)

您可以将array_filtercallback

一起使用
<?php
$array = array(
  0 => 'Message 1' ,
  1 => '%company' ,
  2 => 'Message 2' ,
  3 => '%name' );

  function start_with($var)
  {
      return $var[0] == '%';
  }

  function dont_start_with($var)
  {
      return $var[0] != '%';
  }

  $startw = array_filter($dizi,'start_with'); // filtering elements
  $startw = array_values($startw);  // reseting indexes.

  $nstartw = array_filter($dizi,'dont_start_with');
  $nstartw = array_values($nstartw);

  var_dump($startw , $nstartw);
?>

答案 4 :(得分:1)

$array2=array();
foreach($array as $key => $value)
{
   if($value[0] =='%')
   { 
     $array2[]=$value;
     unset($array[$key]);
   }
}

修改

取消设置后你可以使用foreach循环迭代数组可以使用array_values函数来构造新数组