Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/286.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 从阵列中拾取最近的值_Php_Arrays - Fatal编程技术网

Php 从阵列中拾取最近的值

Php 从阵列中拾取最近的值,php,arrays,Php,Arrays,我有一个数组,根据订购的物品数量反映折扣百分比: $rebates = array( 1 => 0, 3 => 10, 5 => 25, 10 => 35) 这意味着,对于一个或两个项目,您不会得到任何回扣;对于3+项,您可以获得10%,对于5+项,您可以获得20%,对于10+35%,依此类推 对于任意数量的商品,比如说7,是否有一种优雅的单行方式来获得正确的折扣百分比 显然,这可以通过一个简单的循环来解决:这不是我想要的。我感兴趣的是,是否有一个

我有一个数组,根据订购的物品数量反映折扣百分比:

$rebates = array(
   1 => 0,
   3 => 10,
   5 => 25,
  10 => 35)
这意味着,对于一个或两个项目,您不会得到任何回扣;对于3+项,您可以获得10%,对于5+项,您可以获得20%,对于10+35%,依此类推

对于任意数量的商品,比如说
7
,是否有一种优雅的单行方式来获得正确的折扣百分比

显然,这可以通过一个简单的循环来解决:这不是我想要的。我感兴趣的是,是否有一个核心阵列或其他功能,我不知道,可以做到这一点更优雅

我将奖励被接受的答案200英镑,但显然,我必须等待24小时,直到我能做到这一点。问题解决了


到目前为止,我能做的最好的事情是:

$testValue = 7;
array_walk( $rebates, function($value, $key, &$test) { if ($key > $test[0]) unset($test[1][$key]); } array($testValue,&$rebates) );
使用了一个讨厌的按引用传递的小技巧,并删除了$retbates数组中键在数字上大于$testValue的任何条目。。。不幸的是,它仍然保留较低的键控项,因此需要使用数组_pop()来获取正确的值。请注意,它会主动减少原始$rebates数组中的条目

也许有人可以在此基础上放弃数组中较低的条目

目前还没有5.3.3可用,因此没有使用匿名函数进行测试,但在使用标准回调函数时可以正常工作

编辑

在我之前的一行代码的基础上,添加第二行(因此可能不应计算在内):

$testValue=7;
数组(回扣,函数($value,$key,&$test){if($key>$test[0])unset($test[1][$key]);}数组($testValue,&$retabes));
数组_walk(数组_reverse($rebates,true),函数($value,$key,&$test){if($key<$test[0])unset($test[1][$key]);}数组(数组_pop(数组_key($rebates)),&$rebates));

现在的结果是$rebates数组只包含一个元素,是原始$rebates数组的最高断点键,该数组的键低于$testValue。

这可能在不更改rebates数组的情况下工作

但是数组必须以另一种方式构造才能工作

$rebates = array(
   3 => 0,      //Every number below this will get this rebate
   5 => 10,
   10 => 25,
  1000 => 35);  //Arbitrary large numer to catch all

$count = $_REQUEST["count"];

$rv = $rebates[array_shift(array_filter(array_keys($rebates), function ($v) {global $count; return $v > $count;}))];

echo $rv;
使用testcase,只需更改url中的计数



这是另一个,一点也不短

$percent = $rebates[max(array_intersect(array_keys($rebates),range(0,$items)))];

这个想法基本上是为了获得最高的键(
max
),它介于
0
$items

之间。我认为上面这一行的解决方案并不优雅,也不可读。那么,为什么不使用一些第一眼就能被人真正理解的东西呢

$items = NUM_OF_ITEMS;
$rabate = 0;
foreach ($rabates as $rItems => $rRabate) {
    if ($rItems > $items) break;
    $rabate = $rRabate;
}
这显然需要一个排序数组,但至少在您的示例中给出了;)

好吧,我知道,你不想要简单循环的解决方案。但是这个呢:

while (!isset($rabates[$items])) {
    --$items;
}
$rabate = $rabates[$items];
仍然很简单,但是稍微短一点。我们能再短一点吗

for (; !isset($rabates[$items]); --$items);
$rabate = $rabates[$items];
我们已经接近一条线了。让我们做一点作弊:

for (; !isset($rabates[$items]) || 0 > $rabate = $rabates[$items]; --$items);
这比其他答案中的所有方法都要短。它只有一个缺点:它更改了以后可能仍然需要的
$items
的值。因此,我们可以:

for ($i = $items; !isset($rabates[$i]) || 0 > $rabate = $rabates[$i]; --$i);
这又少了一个字符,我们保留了
$items

虽然我认为最后两个版本已经太粗糙了。最好坚持这一条,因为它既简短又易懂:

for ($i = $items; !isset($rabates[$i]); --$i);
$rabate = $rabates[$i];

我接受这个方法是因为它是非破坏性的,是最短的方法,并且不需要全局/闭包。谢谢+我喜欢这个想法,尽管我永远不会在生产代码中使用它。非常好,谢谢。我接受@salathe的方法,因为它稍微短一点,并且不需要全局/闭包就可以工作,但这样也可以工作。当然,他的解决方案更优雅:-)没有这样的核心功能!您知道,当您没有指定最大行长度时,要求使用一行是没有意义的;)钥匙不在一个模式中?因此,我们无法创建一个函数。我认为这应该是一个wiki。@evolve:如果你认为这应该是CW,请标记mod注意,并告诉他们将其设置为CW。此外,我不明白为什么这应该是CW;)
for ($i = $items; !isset($rabates[$i]); --$i);
$rabate = $rabates[$i];