选择PHP数组中的最低值项

时间:2016-06-06 16:29:38

标签: php arrays

我有一个名为$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'值的项目名称,如果存在重复的最低计数器值(如上例中的苹果和梨),那么只有一个是随机选择(必须随机选择)。

有人能帮我这个吗?不幸的是,到目前为止我还没有找到合适的解决方案。提前谢谢!

5 个答案:

答案 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;
});

工作代码:

https://3v4l.org/YPAeh

答案 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/上试用此代码进行在线测试。 我希望你能得到解决方案。