【问题标题】:parsing out the last number of the post解析出帖子的最后一个数字
【发布时间】:2011-04-28 18:33:35
【问题描述】:

好的,所以我有一个看起来像这样的帖子

[optional_premium_1] => Array
    (
        [0] => 61
    )
[optional_premium_2] => Array
    (
        [0] => 55
    )
[optional_premium_3] => Array
    (
        [0] => 55
    )
[premium_1] => Array
  (
     [0] => 33
 )
[premium_2] => Array
  (
     [0] => 36     )
[premium_3] => Array
  (
     [0] => 88     )

[premium_4] => Array
  (
     [0] => 51
 )

我如何从中获得最高的数字。例如,可选的“optional_premium_”最高为 3,而“premium_”可选的最高为 4。我如何在这个 $_POST 中找到最高的

【问题讨论】:

  • 为什么你的键指向数组,而这些数组只包含一个元素?
  • 因为有时值不止一个
  • 应该如何处理这些多个值?是否应该只使用[0] 来确定最高值?
  • 你想知道最高索引还是最高值?

标签: php regex parsing post


【解决方案1】:

你可以使用 array_key_exists(),也许是这样的:

function getHighest($variableNamePrefix, array $arrayToCheck) {
    $continue = true;
    $highest = 0;
    while($continue) {
        if (!array_key_exists($variableNamePrefix . "_" . ($highest + 1) , $arrayToCheck)) {
            $continue = false;
        } else {
           highest++;
        }
    }
    //If 0 is returned than nothing was set for $variableNamePrefix 
    return $highest;
}

$highestOptionalPremium = getHighest('optional_premium', $_POST);
$highestPremium = getHighest('premium', $_POST);

【讨论】:

    【解决方案2】:

    在我回答之前,我有 2 个部分的 1 个问题,这就是您使用嵌入式数组的原因?如果您使用以下标准符号,您的帖子会简单得多:

    $_POST['form_input_name'] = 'whatever';
    

    除非您出于某种原因专门使用数组构建这篇文章。这样你就可以正常使用数组键作为变量名和数组值了。

    所以给定:

    $arr = array(
    "optional_premium_1" => "61"
    "optional_premium_2" => "55"
    );
    

    你可以使用

    $key = array_keys($arr);
    //gets the keys for that array
    //then loop through get raw values
    
    foreach($key as $val){
      str_replace("optional_premium_", '', $val);
    }
    

    //然后再次循环比较每一个

    $highest = 0;
    for each($key as $val){
      if ((int)$val > $highest) $highest = (int)$val;
     }
    

    这应该会让你成为最高的,但你必须回去比较他们,以完成你的最终计划。

    您也可以将它们分成 2 个单独的数组,并假设它们是按顺序添加的,只需使用 end() http://php.net/manual/en/function.end.php

    【讨论】:

      【解决方案3】:

      遍历所有 POST 数组元素,挑选出键名与“name_number”模式匹配的元素,并保存键名中具有最大数字部分的元素。这是一个 PHP 脚本:

      <?php // test.php 20110428_0900
      
      // Build temporary array to simulate $_POST
      $TEMP_POST = array(
          "optional_premium_1"    => array(61),
          "optional_premium_2"    => array(55),
          "optional_premium_3"    => array(55),
          "premium_1"             => array(33),
          "premium_2"             => array(36),
          "premium_3"             => array(88),
          "premium_4"             => array(51),
      );
      
      $names = array();       // Array of POST variable names
      // loop through all POST array elements
      foreach ($TEMP_POST as $k => $v) {
          // Process only elements with names matching "word_number" pattern.
          if (preg_match('/^(\w+)_(\d+)$/', $k, $m)) {
              $name   = $m[1];
              $number = (int)$m[2];
              if (!isset($names[$name]))
              {   // Add new POST var key name to names array
                  $names[$name] = array(
                      "name"      => $name,
                      "max_num"   => $number,
                      "key_name"  => $k,
                      "value"     => $v,
                      );
              } elseif ($number > $names[$name]['max_num'])
              { // New largest number in key name.
                  $names[$name] = array(
                      "name"      => $name,
                      "max_num"   => $number,
                      "key_name"  => $k,
                      "value"     => $v,
                      );
              }
          }
      }
      print_r($names);
      ?>
      

      这是脚本的输出:

      Array
      (
          [optional_premium] => Array
              (
                  [name] => optional_premium
                  [max_num] => 3
                  [key_name] => optional_premium_3
                  [value] => Array
                      (
                          [0] => 55
                      )
      
              )
      
          [premium] => Array
              (
                  [name] => premium
                  [max_num] => 4
                  [key_name] => premium_4
                  [value] => Array
                      (
                          [0] => 51
                      )
      
              )
      
      )
      

      【讨论】:

        【解决方案4】:

        虽然无效,但您可以尝试类似的方法

        $largest = 0;
        
        foreach($_POST as $key => $value)
        {
            $len = strlen("optional_premium_");
            $num = substr($key, $len);
        
            if($num > $largest)
                $largest = $num;
        }
        
        print_r($largest);
        

        问题在于这仅适用于一组类别。它很可能会在整个脚本中出现错误。

        理想情况下,你会想要重新组织你的帖子,让每个数组都像

        [optional_premium_1] => Array
        (
            [0] => 61
            ["key"] => 1
        )
        [optional_premium_2] => Array
        (
            [0] => 61
            ["key"] => 2
        )
        

        然后只需foreach 并使用$array["key"] 进行搜索。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2023-03-31
          • 1970-01-01
          • 2014-08-14
          • 2015-03-01
          • 1970-01-01
          • 1970-01-01
          • 2016-04-25
          相关资源
          最近更新 更多