将关联数组划分为两个相等的数组,其中包含php中的最大值和最小值

时间:2016-03-19 14:01:13

标签: php arrays

我有这样的数组

Array
(
    [0] => Array
        (
            [items] => 42
            [prize] => 122
        )

    [1] => Array
        (
            [items] => 14
            [prize] => 789
        )

    [2] => Array
        (
            [items] => 76
            [prize] => 1228
        )

    [3] => Array
        (
            [items] => 23
            [prize] => 122
        )

    [4] => Array
        (
            [items] => 15
            [prize] => 567
        )

)

从此我想创建两个数组,其中一个包含items的最大数量,另一个包含最小数量的项目

预期输出

array1(最多)

[0] => Array
        (
            [items] => 76
            [prize] => 1228
        )

    [1] => Array
        (
            [items] => 42
            [prize] => 122
        )

    [2] => Array
        (
            [items] => 23
            [prize] => 122
        )

数组2(最小)

[0] => Array
        (
            [items] => 15
            [prize] => 567
        )

    [1] => Array
        (
            [items] => 23
            [prize] => 122
        )

n是长度原始数组

if(n is odd)

length firstarr=ceil(n/2);

length secondarr =n- ceil(n/2)

else 

length firstarr=secondarr=n/2

那么我怎样才能在最大值和最小值范围内实现上述目标?

2 个答案:

答案 0 :(得分:1)

您应该首先按数量排序数组。我们会按升序排列,但实际上并不重要。

有几种不同的方法可以实现这一目标。您可以使用array_multisort,但我认为usort使用匿名函数会更短,更容易理解。

如果你有PHP 5.2或更早版本,你必须将匿名函数代码移动到一个命名函数并调用它 那样。如果你有幸拥有PHP 7,你可以在函数中执行return $a["items"] <=> $b["items"];

$array = [["items" => 42, "prize" => 122], ["items" => 14, "prize" => 789],
          ["items" => 76, "prize" => 1228], ["items" => 23, "prize" => 122],
          ["items" => 15, "prize" => 567]];
usort($array, function($a, $b) {
    return $a["items"] < $b["items"] ? -1 : ($a["items"] > $b["items"] ? 1 : 0); });

现在将其拆分为最高和最低值。在array_splice后,$array变量将仅包含 尚未删除并保存到$lowest的值。

在您的示例中,最高值按降序排列,但我们的值按升序排列。 array_reverse会解决此问题。

$lowest = array_splice($array, 0, floor(count($array) / 2));
$highest = array_reverse($array);

var_dump($highest);
var_dump($lowest);

答案 1 :(得分:1)

您可以使用usort()并将值传递给回调进行比较,注意回调中使用闭包,

<?php

function sort_order($key, $order=1){
    if($order==1){
        return function ($a, $b) use ($key) {
            return strcmp("$a[$key]","$b[$key]");
        };        
    }
    else{
        return function ($a, $b) use ($key) {
            return strcmp("$b[$key]","$a[$key]");
        };  
    }

}

$minimal = array
(
    0 => array
        (
            'items' => 42,
            'prize' => 122
        ),

    1 => array
        (
            'items' => 14,
            'prize' => 789
        ),

    2 => array
        (
            'items' => 76,
            'prize' => 1228
        ),

    3 => array
        (
            'items' => 23,
            'prize' => 122
        ),

    4 => array
        (
            'items' => 15,
            'prize' => 567
        )


);


$maximum = $minimal;

usort($minimal, sort_order('items'));
usort($maximum, sort_order('items',2));
print_r($minimal);
print_r($maximum);
?>

这是小提琴:https://eval.in/539270