根据每个元素的第一个字符将数组拆分为两个数组

问题描述 投票:0回答:5

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

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>
这是必需的......),而不是输出真实的消息,我想输出必需的和未填充的输入的名称,将其放入漂亮的一条消息“字段这个、那个甚至那个都是强制性的”。

php arrays conditional-statements filtering grouping
5个回答
18
投票

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

8
投票

很抱歉重新提出这个问题,但是像这样的简单过滤是超级简单,带有

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

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

2
投票

您可以将array_filter回调一起使用,

<?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);
?>

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

编辑

取消设置后,您可以使用

foreach
循环来迭代数组可以使用
array_values
函数来构造新数组

© www.soinside.com 2019 - 2024. All rights reserved.