#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"]
для поиска.