1

好的,首先,我什至不确定标题是否正确,如果是,我很抱歉。

我在这里有这个循环,它是 MongoDB 查询的结果:

foreach($cursor as $obj) {
   $monster = $obj["type"];
   $strenght = $obj["strenght"];
   $obj["value"] = rand(5, 15);
}

现在,我放在rand那里以表示value每次迭代的更改。现在我希望这个数组在打印时按那个排序$obj["value"],并且能够选择是升序还是降序。


好的,我试过这个

foreach($cursor as $obj) {
   $type = $obj["monster"];
   $strenght = $obj["strenght"];
   $obj["value"] = rand(5, 15);

   $newarr[] = $obj;
}

    usort($newarr, "cmp");
    function cmp($a, $b)
    { return $b['value'] < $a['value']; }

    foreach ($newarr as $obj)
    {
        echo $obj['value'] . $obj['type'] . "<br/>";
    }

正如我所料,

 $obj["value"] = rand(5, 15);

事实上,$newarr 不会在每次迭代中丢失,但问题是它根本不对它们进行排序。这些项目的打印顺序与它们放入数组中的顺序相同。有什么帮助吗?

谢谢

4

5 回答 5

0

首先,通过这样做,$obj["value"] = rand(..)您将多次分配具有不同值的相同数组变量。到循环结束时,变量将只包含一个值。

你可能试图这样做

$obj["value"][] = rand(5, 15); //This adds a new random item to the array contained in $obj['value'] each time

当你有一个数组项时,你可以使用sort() [ascending] function rsort() [Descending[

$sorted = sort($obj["value"]);
print_r($sorted);
于 2012-04-15T07:25:07.917 回答
0
function mysort ($arr,$d='asc') { 
        global $dir; 
        $dir = $d; 
        uasort($arr, 'cmp'); 
        return ($arr); 
    } 
    function cmp ($a, $b) {
        global $dir;
        if($a['value'] == $b['value']) return 0;
        else  {
            if(strtolower($dir) == 'asc')
                return ($a['value'] > $b['value']) ? 1 : -1;
            else if(strtolower($dir) == 'disc')
                return ($a['value'] > $b['value']) ? -1 : 1;

        }
    } 
    print_r(mysort($obj, 'disc'));

根据您的更新

试试这个cmp()

function cmp($a, $b) {
    if($a['value'] == $b['value']) return 0;
    return $a['value'] > $b['value'] ? 1 : -1;
}
于 2012-04-15T07:25:12.180 回答
0

你失去了这个价值

 $obj["value"] = rand(5, 15); 

我猜在每次迭代中。检查此链接以获取 php foreach 循环:

PHP FOREACH

对于排序你可以使用php的排序功能:

PHP 排序

于 2012-04-15T07:25:19.667 回答
0

你的 foreach 不会真正产生任何有用的东西。所以我创建了一个示例数组来说明原理:

$array = array(
    array(
        'type' => 'type a',
        'strength' => '10',
        'value' => '12',
    ),
    array(
        'type' => 'type b',
        'strength' => '12',
        'value' => '15',
    ),
    array(
        'type' => 'type c',
        'strength' => '11',
        'value' => '6',
    ),
);

现在你希望这个多维数组按值排序,所以如果它是降序排列的,你会得到一个 b 类型的列表,输入 a,然后输入 c。

您正在寻找的功能是 array_multisort() 。这是一个如何在这个特定实例上使用它的示例。首先,您需要为函数创建该排序器数组来完成它的工作。然后只需使用 multisort 就完成了。

$sorter = array();

foreach ($array as $key => $row) {
    $sorter[$key] = $row['value'];
}

array_multisort($sorter, SORT_DESC, $array);

现在 $array 已根据规范使用。使用 SORT_ASC 反转排序。

添加的代码:为了完整起见,这里是您的 foreach 代码,从技术上讲,它应该首先创建您想要的内容:

$array = array();

foreach($cursor as $obj) {
   $row = array();

   $row['type']  = $obj['type'];
   $row['strength']  = $obj['strenght'];
   $row['value'] = rand(5, 15);

   $array[] = $row;
}

你的力量也有错别字:)

于 2012-04-15T09:54:47.483 回答
0

由于您使用的是整数值,因此您可以简单地使用它:

usort($newarr, "cmp");
function cmp($a, $b) {
    return $b['value'] - $a['value'];
}

它将按降序对您的键进行排序,如果您想将其更改为升序,请交换 $a 和 $b。


排序函数通常期望比较函数在项目相同时返回值 0,如果第一个参数小于第二个参数,则返回 <0(在特定情况下无论 less 意味着什么),如果第一个参数大于,则返回 >0第二。

对于整数值,这可以简单地写成 $a - $b 或 $b - $a。

于 2012-04-15T10:09:21.707 回答