парсинг последнего номера поста - PullRequest
1 голос
/ 28 апреля 2011

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

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

как мне получить наибольшее число из этого. Так, например, необязательный параметр «option_premium_ » равен 3, а необязательный параметр «premium_ » - 4. Максимум в этом $ _POST

Ответы [ 4 ]

2 голосов
/ 29 апреля 2011

Переберите все элементы массива 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
                )

        )

)
2 голосов
/ 28 апреля 2011

У меня есть 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

2 голосов
/ 28 апреля 2011

Вы можете использовать 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);
1 голос
/ 28 апреля 2011

Хотя это неэффективно, вы можете попробовать что-то вроде

$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"] искать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...