разбор последнего номера сообщения

#php #regex #parsing #post

#php #регулярное выражение #синтаксический анализ #Публикация

Вопрос:

Хорошо, итак, у меня есть сообщение, которое выглядит примерно так

 [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

Комментарии:

1. почему ваши ключи указывают на массивы, когда эти массивы содержат только один элемент?

2. потому что иногда существует более одного значения

3. И как следует обрабатывать эти множественные значения? Следует ли использовать только [0] для определения самого высокого?

4. Вы хотите знать самый высокий индекс или самое высокое значение?

Ответ №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:

У меня есть 1 вопрос из 2 частей, прежде чем я отвечу, и именно поэтому вы используете встроенные массивы? Ваш пост был бы намного проще, если бы вы использовали стандартную запись, такую как:

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

Проблема в том, что это будет работать только для одного набора категорий. Скорее всего, это приведет к ошибкам во всем скрипте.

В идеале, вы хотели бы реорганизовать свой post, сделать каждый массив чем-то вроде

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

Затем просто foreach и используем $array["key"] для поиска.