将 Assocative 数组分成两个相等的数组,在 php 中具有最大值和最小值


Divide Assocative array into two equal array with maximum and minmum values in php

我有一个这样的数组

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数,另一个包含最小数量的项目

预期产出

阵列1(最大值)

[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

那么,我怎样才能用最大值和最小值范围来填充上述值呢?

您应该首先按项目数对数组进行排序。我们将按升序排列,但这真的无关紧要。

有几种不同的方法可以实现此目的。您可以使用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);

您可以使用 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