我有一个名为$products
的数组。
如果我执行此数组的print_r
,我会得到以下输出:
Array
(
[0] => Array
(
[0] => 2
[counter] => 2
[1] => Oranges
[item] => Oranges
)
[1] => Array
(
[0] => 3
[counter] => 3
[1] => Bananas
[item] => Bananas
)
[2] => Array
(
[0] => 1
[counter] => 1
[1] => Apples
[item] => Apples
)
[3] => Array
(
[0] => 1
[counter] => 1
[1] => Pears
[item] => Pears
)
)
我希望能够列出具有最低'counter'
值的项目名称,如果存在重复的最低计数器值(如上例中的苹果和梨),那么只有一个是随机选择(必须随机选择)。
有人能帮我这个吗?不幸的是,到目前为止我还没有找到合适的解决方案。提前谢谢!
答案 0 :(得分:1)
array_rand()
编辑:更新了代码。
EDIT2:在代码
下方添加解释此代码的工作原理如下:
循环遍历整个阵列。每个步骤检查计数器是否低于先前存储的计数器,最初是最高可能的int值。如果是,则完全重置具有所有想要值的数组。
接下来,循环检查最低值是否与先前存储的“最低”值相同。如果是,则将项目名称添加到数组中。通过这种方式,syou可以在一个数组中收集具有最低值(一个或多个项目名称)的所有项目名称。如果出现一个较小的值,则之前的所有项目名称都不再有趣,因此可以删除。循环完成后,函数{{1}}会输出一个随机值,如您所愿。它以字符串形式输出,但也可以分配给变量。
我希望这有助于理解我的代码。
答案 1 :(得分:1)
如何使用usort进行简化?
function compare_products($product1, $product2){
if($product1['counter'] == $product2['counter']){
return rand(0,1) ? 1 : -1//if it is the same then it is random
}
return $product1['counter'] > $product2['counter'];// if not it sorts the array
}
$products = ...;//your array
usort($products, "compare_products");
然后去做最低的只做
echo $products[0];
工作示例here (Idone) 我为示例简化了数组
答案 2 :(得分:0)
我个人会在这种情况下使用usort,所以如果两个元素有相同的计数器,你可以预见到以后。
此外,您可以从mysql查询中轻松解决该问题,但以下是我将如何执行此操作:
.header {
line-height:100px;
}
说明:
<?php
$products = array(
array(
"counter" => 2,
"item" => "Oranges"
),
array(
"counter" => 3,
"item" => "Bananas"
),
array(
"counter" => 1,
"item" => "Apples"
),
array(
"counter" => 1,
"item" => "Pears"
)
);
usort($products, function($previous, $next) {
return $previous["counter"] > $next["counter"] ? 1 : -1;
});
echo "Lowest counter is: {$products[0]['item']}";
?>
usort将$ products(数组)作为数组来一次获取和循环两个项目(上一个和下一个),返回语句检查前一个元素的计数器是否高于下一个,如果是,它放置在它之后,在它之前。
最后,您将把数组元素从最低计数器1排序到最高计数器。
我建议你,以后再获得具有相同计数器值的那些,如果在这种情况下,你有两个都很低的元素,就像这样:
usort($products, function($previous, $next) {
return $previous["counter"] > $next["counter"] ? 1 : -1;
});
工作代码:
答案 3 :(得分:0)
这将使您的$products
循环遍历每个<?php
//products is defined somewhere
$lowValues = array();
//Just to get it started
$currentLowest = $products[0]["counter"];
foreach($products as $product){
if($product["counter"] == $currentLowest){
//When Equal just add it
$lowValues[] = $product["item"];
} elseif($product["counter"] < $currentLowest) {
//When lower set as lowest
$currentLowest = $product["counter"];
//Remove all old values
unset($lowValues);
//Add this to the low values
$lowValues[] = $product["item"];
} else {
//Nothing to do here...
}
}
//array_rand is an index.
echo $lowValues[array_rand($lowest)];
?>
。使用第一个元素设置currentLowest。如果值匹配,则会将其添加到数组中。如果找不到更少的东西,它将替换currentLowest并删除将该值添加到新值的数组值。最后,array_rand将为您提供一个可用于访问lowValues的随机索引。
remote: gcc -pthread -fno-strict-aliasing -g -O2 -DNDEBUG -g -fwrapv -O3 -Wall -Wstrict-prototypes -fPIC -DUSE__THREAD -I/usr/include/ffi -I/usr/include/libffi -I/app/.heroku/miniconda/include/python2.7 -c c/_cffi_backend.c -o build/temp.linux-x86_64-2.7/c/_cffi_backend.o
remote: c/_cffi_backend.c:15:17: fatal error: ffi.h: No such file or directory
remote: #include <ffi.h>
remote: ^
remote: compilation terminated.
remote: error: command 'gcc' failed with exit status 1
remote:
remote: ----------------------------------------
remote: Command "/app/.heroku/miniconda/bin/python -u -c "import setuptools, tokenize;__file__='/tmp/pip-build-HrTCjj/cffi/setup.py';exec(compile(getattr(tokenize, 'open', open)(__file__).read().replace('\r\n', '\n'), __file__, 'exec'))" install --record /tmp/pip-VNanYj-record/install-record.txt --single-version-externally-managed --compile" failed with error code 1 in /tmp/pip-build-HrTCjj/cffi/
remote: You are using pip version 8.1.1, however version 8.1.2 is available.
remote: You should consider upgrading via the 'pip install --upgrade pip' command.
remote:
remote: ! Push rejected, failed to compile Python/Conda app
remote:
remote: Verifying deploy....
remote:
remote: ! Push rejected to newhapp.
remote:
To https://git.heroku.com/newhapp.git
$heroku logts --tail
Slug compilation failed: failed to compile Python/Conda app
答案 4 :(得分:0)
你想从$ data获得随机最小数组。为此,您应该执行以下代码。
$data[]=array
(
'0' => 2,
'counter' => 2,
'1' => 'Oranges',
'item' => 'Oranges'
);
$data[]=array
(
'0' => 3,
'counter' => 3,
'1' => 'Bananas',
'item' => 'Bananas'
);
$data[]=array
(
'0' => 1,
'counter' => 1,
'1' => 'Apples',
'item' => 'Apples'
);
$data[]=array
(
'0' => 1,
'counter' => 1,
'1' => 'Pears',
'item' => 'Pears'
);
$min=min(array_column($data, 'counter'));
$minarray=array();
foreach($data as $key=>$value) {
if($value['counter']==$min){
array_push($minarray,$value);
}
}
$rand_keys =array_rand($minarray);
echo"<pre>";
print_r($minarray[$rand_keys]);
在http://phpfiddle.org/上试用此代码进行在线测试。 我希望你能得到解决方案。