【问题标题】:PHP separate even and odd values from an arrayPHP从数组中分离偶数和奇数
【发布时间】:2013-04-26 08:29:43
【问题描述】:

我正在使用下面的代码来分隔奇数和偶数并将其存储在不同的变量中。当只有 2 个值可用时,它工作正常,但当数值增加时,它不会。我想让它动态化,以便可以正确分离和存储 n 个值。

示例: 如果

的值
$final_array = "PNL testing 1,10,PNL testing 2,35,";

打印效果很好:

$teams = "PNL testing 1, PNL testing 2";

$amount = "10, 35";

但是当它从

$final_array = "PNL testing 1,10,PNL testing 2,35,";

$final_array = "PNL testing 1,10,PNL testing 2,35,Team 3,95,";

然后它也会打印出来

$teams = "PNL testing 1, PNL testing 2";

$amount = "10, 35"; 

请指导我了解我哪里出错了。

$res = array();
$result = preg_match_all("{([\w\s\d]+),(\d+)}", $final_array, $res);
$teams = join(', ', $res[1]); //will display teams
$amount = join(', ', $res[2]); //will display amount every team have
echo $teams . "<br />" . $amount;

【问题讨论】:

  • 真的不明白这与偶数和奇数有何关系?
  • 可能会在这里找到您想要的东西.. stackoverflow.com/questions/738168/filter-array-odd-even?rq=1
  • 您提到的打印代码:PNL testing 1, PNL testing 2, Team 3$teams10, 35, 95$amount,不是您所说的打印代码。
  • 所以基本上,如果团队数量是奇数,你想放弃 1 个团队?

标签: php regex arrays preg-match


【解决方案1】:

我认为你可以完全放弃正则表达式,转而使用旧的 explode/implode,其中包含一些逻辑:

$teams = array();
$amount = array();

$a = explode(',', trim(trim($final_array), ','));
foreach ($a as $i => $v)
    if (($i % 2) == 0) $teams[] = trim($a);
    else $amount[] = trim($a);

$teams = implode(', ', $teams);
$amount = impode(', ', $amount);

在上面的代码中$tms$amn 是临时数组。在 foreach 中,我们从字符串中取出分解后的值,然后将它们存储在这两个数组中,按键对其进行排序(如果它是偶数则它是一个 team 否则它是一个 amount) .

最后,我们只是将新值内爆到您的输出变量 $teams$amount

【讨论】:

    【解决方案2】:

    我认为使用explode会容易得多:

    $result = explode(',', $final_array);
    
    $teams = array();
    $amount = array();
    
    foreach ($result as $key => $value) {
        if ($key % 2 == 0) {
            $teams[] = $value;
        } else {
            $amount[] = $value;
        }
    }
    
    $teams  = implode(', ', $teams); //will display teams
    $amount = implode(', ', $amount); //will display amount every team have
    echo $teams."<br />".$amount;
    

    【讨论】:

    • 我认为$key % 2 == 1 应该是$key % 2 == 0
    • 我也会这样做。也许从rtrim($final_array, ',')..开始?
    • @Jueecy.new 你说得对。当我想到0 % 2 = 1 时,我有一瞬间的疯狂。它现在让我有点害怕 ;) @nbrogi - 这更多的是微调代码,但当然是一个有价值的建议:)
    【解决方案3】:

    我会更改 Michal Trojanowski 的这一部分以提高效率

    foreach ($result as $key => $value) {
        if ($key % 2 == 0) {
            $teams[] = $value;
        } else {
            $amount[] = $value;
        }
    }
    

    你看它有一个额外的条件,我们可以像这样删除它

    $length = count($result);//cache count result
    for ($i = 0; $i < $length; $i += 2) {
        $teams[] = $result[$i];
    }
    
    for ($i = 1; $i < $length; $i += 2) {
        $amount[] = $result[$i];
    }
    

    这里的循环运行相同,但它只是删除了条件。

    【讨论】:

      猜你喜欢
      • 2012-01-20
      • 1970-01-01
      • 2014-08-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多