#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 если вы запустите его там, я просто изменил ваши
var_dump($newPrices)
5. Понял. Предупреждения на sandbox.onlinephpfunctions.com исчезла и исправлена опечатка в $return_arr.