Отсортировать массив Min и Max, но избавиться от начальных пустых строк и вернуть «», где все значения одинаковы?

#php #max #min

#php #макс #min

Вопрос:

Я пытаюсь получить минимальные и максимальные значения массива, который отсортирован с _price помощью , _sale_price , и _regular_price , но имеет идентификаторы в качестве первого ключа, и мне нужно сохранить связь значения идентификатора, привязанного к этим ценам. Я использую приведенный ниже код… но проблема с этим заключается в том, что он возвращает мне пару ключ => значение, а другая проблема заключается в том, что мне min("") возвращается min(_price) значение, но мне нужно, чтобы оно возвращало минимальное положительное число в группе. вместо этого.

 function GetMinMaxPrices(Array $prices)
{
    if (empty($prices)) return array();

    // Get highest and lowest for all keys:  _regular_price, _sale_price, and _price.
    foreach($prices as $varBar => $price_info)
    {
        foreach($price_info as $type => $value)
        {
            switch($type)
            {
                CASE "_price":
                $_price[$varBar]['_price'] = array($varBar => $value);
                break;
                CASE "_sale_price":
                $_sale_price[$varBar]['_sale_price'] = array($varBar => $value);
                break;
                CASE "_regular_price":
                $_regular_price[$varBar]['_regular_price'] = array($varBar => $value);
                break;
            }
        }
    }

    return array(
        '_price' => array(
            'max' => max(array_map("max", $_price)),
            'min' => min(array_map("min", $_price))
        ),
        '_sale_price' => array(
            'max' => max(array_map("max", $_sale_price)),
            'min' => min(array_map("min", $_sale_price))
        ),
        '_regular_price' => array(
            'max' => max(array_map("max", $_regular_price)),
            'min' => min(array_map("min", $_regular_price))
        )
    );
}



$newArray[234290911]['_price'] = '2';
$newArray[234230495]['_price'] = '35';
$newArray[239402343]['_price'] = '';

$newArray[239402343]['_regular_price'] = 65;
$newArray[234290911]['_regular_price'] = 70;
$newArray[234230495]['_regular_price'] = 35;

$newArray[234290911]['_sale_price'] = 1;
$newArray[239402343]['_sale_price'] = 1;
$newArray[234230495]['_sale_price'] = 10;

$newPrices = GetMinMaxPrices($newArray);

var_dump($newPrices);
  

Могут быть ситуации, когда в некоторых ценах найдена пустая строка, в этом случае ее нужно пропустить. Если все значения для данной группы ( _price , _sale_price , или _regular_price ) представляют собой пустую строку, то необходимо вернуть пустую строку для этой группы (как в настоящее время делает min), но только если все значения в этой группе являются пустыми строками. В настоящее время, если какое-либо значение в группе является пустой строкой, оно возвращает его как min значение.

Я понимаю, что min это предназначено для этого, но как обойти это, все еще получая ассоциацию $ varBar (идентификаторы вариантов).

Желаемый массив для возвращаемого значения функции GetMinMaxPrices() будет таким, для каждой группы соответственно:

 array('_price' => array(
    'max_value' => $theMaxPriceValue,
    'max_id' => $varBar_max_id,
    'min_value' => $theMinPriceValue,
    'min_id' => $varBar_min_id
), // etc. etc. );
  

Если все значения одинаковы, мне это не нужно. Если минимальное значение = «», то мне нужно фактическое минимальное значение, которое больше 0. Если все значения в массиве для каждой группы равны пустой строке, тогда он должен возвращать пустую строку, и только тогда.

Кажется, я очень близок к этому в функции, но просто не могу вернуть min значение, которое не является пустой строкой, например, в _price массиве есть пустая строка, и она дает мне min значение «», но вместо этого должна дать мне min значение 2 .

Ответ №1:

Это:

 function GetMinMaxPrices(Array $prices)
{
    if (empty($prices)) { return array(); }
    else { $return_arr = array(); }

    // Get highest and lowest for all keys:  _regular_price, _sale_price, and _price.
    foreach($prices as $varBar => $price_info)
    {
      if ( !('' === $price_info['_price'] 
        amp;amp; '' === $price_info['_regular_price'] 
        amp;amp; '' === $price_info['_sale_price']) ) 
      {
        foreach($price_info as $type => $value)
        {
          if ( '' !== $value ) {
            switch($type)
            {
                CASE "_price":
                  if ( !isset($return_arr['_price']['max_value']) 
                    || $value > $return_arr['_price']['max_value'] ) {
                    $return_arr['_price']['max_value'] = $value;
                    $return_arr['_price']['max_id'] = $varBar;
                  }
                  if ( !isset($return_arr['_price']['min_value']) 
                    || $value < $return_arr['_price']['min_value'] ) {
                    $return_arr['_price']['min_value'] = $value;
                    $return_arr['_price']['min_id'] = $varBar;
                  }
                  break;
                CASE "_sale_price":
                  if ( !isset($return_arr['_sale_price']['max_value']) 
                    || $value > $return_arr['_sale_price']['max_value'] ) {
                    $return_arr['_sale_price']['max_value'] = $value;
                    $return_arr['_sale_price']['max_id'] = $varBar;
                  }
                  if ( !isset($return_arr['_sale_price']['min_value']) 
                    || $value < $return_arr['_sale_price']['min_value'] ) {
                    $return_arr['_sale_price']['min_value'] = $value;
                    $return_arr['_sale_price']['min_id'] = $varBar;
                  }
                  break;
                CASE "_regular_price":
                  if ( !isset($return_arr['_regular_price']['max_value']) 
                || $value > $return_arr['_regular_price']['max_value'] ) {
                    $return_arr['_regular_price']['max_value'] = $value;
                    $return_arr['_regular_price']['max_id'] = $varBar;
                  }
                  if ( !isset($return_arr['_regular_price']['min_value']) 
                    || $value < $return_arr['_regular_price']['min_value'] ) {
                    $return_arr['_regular_price']['min_value'] = $value;
                    $return_arr['_regular_price']['min_id'] = $varBar;
                  }
                  break;
            }
          }
        }
      }
    }
    return $return_arr;
}



$newArray[234290911]['_price'] = '2';
$newArray[234230495]['_price'] = '35';
$newArray[239402343]['_price'] = '';

$newArray[239402343]['_regular_price'] = 65;
$newArray[234290911]['_regular_price'] = 70;
$newArray[234230495]['_regular_price'] = 35;

$newArray[234290911]['_sale_price'] = 1;
$newArray[239402343]['_sale_price'] = 1;
$newArray[234230495]['_sale_price'] = 10;

$newPrices = GetMinMaxPrices($newArray);

print '<pre>';
print_r($newPrices);
print '</pre>';
  

Выводит:

 Array
(
    [_price] => Array
        (
            [max_value] => 35
            [max_id] => 234230495
            [min_value] => 2
            [min_id] => 234290911
        )

    [_regular_price] => Array
        (
            [max_value] => 70
            [max_id] => 234290911
            [min_value] => 35
            [min_id] => 234230495
        )

    [_sale_price] => Array
        (
            [max_value] => 10
            [max_id] => 234230495
            [min_value] => 1
            [min_id] => 234290911
        )

)
  

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

1. Здравствуйте, я получаю неопределенные переменные… $return_arr в строке 18, _sale_price в строке 27 и _regular_price в строке 36…

2. Привет, спасибо, кажется, работает, но есть ли способ избавиться от ошибок? Теперь в строках … 18, 29 и 40.

3. Мои строки, похоже, не соответствуют вашим строкам, и я не получаю ошибок, поэтому опишите строки, в которых вы получаете ошибки. Кроме того, я выполняю этот код здесь: compileonline.com/execute_php_online.php К сожалению, я не вижу способа поделиться этим. Вопрос, вы используете тот же $newArray, что и в примере?

4. Я запускаю ваш точный код прямо здесь: sandbox.onlinephpfunctions.com если вы запустите его там, я просто изменил ваши print функции на var_dump($newPrices)

5. Понял. Предупреждения на sandbox.onlinephpfunctions.com исчезла и исправлена опечатка в $return_arr.