1

これは私の問題です: 属性の最大値を持つ配列の 4 つのメンバーを取得する必要があります。max() 関数は既に見ましたが、これは 1 つのメンバーしか取得できず、4 つ必要です。たとえば、次のような配列を使用できます。

array( 
    array(
        "1", 
        "10"
    ), 
    array(
        "9", 
        "10"
    ), 
    array(
        "3", 
        "10"
    ), 
    array(
        "4", 
        "10"
    ), 
    array(
        "10", 
        "10"
    ), 
    array(
        "8", 
        "10"
    ), 
    array(
        "7", 
        "10"
    ), 
    array(
        "6", 
        "10"
    ), 
    array(
        "5", 
        "10"
    ), 
    array(
        "9", 
        "10"
    ) 
)

次の 4 つのメンバーを取得する関数が必要です。

配列("10", "10"), 配列("9", "10"), 配列("8", "10"), 配列("7", "10")

誰でも助けることができますか?

4

2 に答える 2

1

usort()で配列を降順にソートします。array_slice
を介して最初の 4 つの項目を選択します

<?php
$ar = getData();
usort( $ar, function($a,$b) { return -strnatcmp($a[0], $b[0]); });
$result = array_slice($ar, 0, 4);
var_dump($result);

function getData() {
    return array(
        array("1", "10"),
        array("9", "10"),
        array("3", "10"),
        array("4", "10"),
        array("10", "10"),
        array("8", "10"),
        array("7", "10"),
        array("6", "10"),
        array("5", "10"),
    );
}

版画

array(4) {
  [0]=>
  array(2) {
    [0]=>
    string(2) "10"
    [1]=>
    string(2) "10"
  }
  [1]=>
  array(2) {
    [0]=>
    string(1) "9"
    [1]=>
    string(2) "10"
  }
  [2]=>
  array(2) {
    [0]=>
    string(1) "8"
    [1]=>
    string(2) "10"
  }
  [3]=>
  array(2) {
    [0]=>
    string(1) "7"
    [1]=>
    string(2) "10"
  }
}
于 2012-08-31T13:36:16.440 に答える
0

または、単純なアルゴリズム (私が考える最も単純なアルゴリズム) をすばやく使用できます。

$nbrItems = 0;
$greaters = array();
$lessthan = null;
while ($nbrItems < 4 && count($myArray) >= 4) {
    $tmp = reset($myArray);
    foreach($myArray as $item) {
        if ($item[0] > $tmp[0] && ($item[0] < $lessthan || $lessthan === null)) {
            $tmp = $item;
        }
    }
    if ($tmp[0] < $lessthan || $lessthan === null) {
        $greaters[] = $tmp;
        $nbrItems++;
        $lessthan = $tmp[0];
    }
}
print_r($greaters);

既存の関数を使用せずに、どのように機能させるかを見るのは常に興味深いことです... :)

于 2012-08-31T13:55:13.870 に答える