-1

配列を特定の順序で並べ替えようとしています:

私のコード(現在の配列):

Array
(
[25] => Array
    (
        [1st place] => 
    )

[15] => Array
    (
        [2nd place] => 
    )

[10] => Array
    (
        [3rd place] => 
    )

[5] => Array
    (
        [4th place] => 
        [5th place] => 
        [6th place] => 
        [7th place] => 
        [8th place] => 
        [9th place] => 
        [10th place] => 
    )

[1] => Array
    (
        [11th place] => 
        [12th place] => 
        [13th place] => 
        [14th place] => 
        [15th place] => 
        [16th place] => 
        [17th place] => 
        [18th place] => 
        [19th place] => 
        [20th place] => 
        [21st place] => 
        [22nd place] => 
        [23rd place] => 
        [24th place] => 
        [25th place] => 
    )

)

配列が必要:

Array
(
[0] => Array
    (
        [1st place] => 25
    )

[1] => Array
    (
        [2nd place] => 15
    )

[5] => Array
    (
        [3rd place] => 10
    )

[3] => Array
    (
        [4th place] => 5
        [5th place] => 5
        [6th place] => 5
        [7th place] => 5
        [8th place] => 5
        [9th place] => 5
        [10th place] => 5
    )

[4] => Array
    (
        [11th place] => 1
        [12th place] => 1
        [13th place] => 1
        [14th place] => 1
        [15th place] => 1
        [16th place] => 1
        [17th place] => 1
        [18th place] => 1
        [19th place] => 1
        [20th place] => 1
        [21st place] => 1
        [22nd place] => 1
        [23rd place] => 1
        [24th place] => 1
        [25th place] => 1
    )

)

アイデアは、キーの値として配列位置(?)を使用し、次の順序で配列を設定するようなものです。

私はそのコード(php)で試しています

foreach ($newOptions as $ord) {
            $place = $ord[$idx];
            $value = $ord[$idx][0];
            $newOrderarr[$idx][$value][$place] = $name2;
            $idx++;
        }

しかし、うまく機能していません$ newoptionsは、私が使用している配列です...

4

5 に答える 5

5

誰も明白なソート方法を採用しませんでしたか?

uasort($data, function($a, $b) {
    reset($a);
    reset($b);
    $aVal = (int) key($a);
    $bVal = (int) key($b);

    if ($aVal < $bVal) {
        return -1;
    } elseif ($bVal < $aVal) {
        return 1;
    } else {
        return 0;
    }
});

これにより、サブ配列の内部ポインターがリセットされますが、問題になる可能性は低く、とにかくコピーである可能性があることに注意してください。また、そこに空のサブ配列がある場合、それは機能しません。その場合array_filter、最初にそれを呼び出して、空の値を削除します。

于 2012-11-20T18:36:59.113 に答える
2

あなたはこれを試すかもしれません:

foreach($your_array as $key => &$bla) {
    foreach($bla as &$item) {
        $item = $key;
    }
}

sort($your_array);

しかし、そもそもデータ構造を修正したいのですが、少なくとも...奇妙に思えます。

于 2012-11-20T18:57:35.693 に答える
1

配列構造がどのように完成するかはわかりませんが、このようにする強い理由がある場合は、次のように並べ替えることができます。

#recreating your data:
$newOptions = array();
$newOptions[25] = array('1st place' => '');
$newOptions[15] = array('2nd place' => '');
$newOptions[10] = array('3rd place' => '');
$newOptions[5] = array('4th place' => '', '5th place' => '', '6th place' => '', '7th place' => '', '8th place' => '', '9th place' => '', '10th place' => '');
$newOptions[1] = array('11th place' => '', '12th place' => '', '13th place' => '', '14thth place' => '', '15thth place' => '', '16th place' => '', '...' => '');

#sorting as you wanted
$newArray = array();
foreach ($newOptions as $id => $options) {
   $newOptions = $options;
   foreach ($newOptions as $optid => $option) {
      $newOptions[$optid] = $id;
   }
   $newArray[] = $newOptions;
}
$newOptions = $newArray;
于 2012-11-20T16:28:42.030 に答える
1

あなたの構造は私には意味がありませんか?私は少し違うものを選びましたが、うまくいけばあなたのニーズにうまく合うでしょう!

<?php
$scores = array(15, 20, 50, 100, 4);
sort($scores);

for($i = 0; $i < count($scores); $i++) {
    $new_array[] = array('score' => $scores[$i], 'text' => ordinal($i + 1) . " Place");
}

print_r($new_array);




// Ordinal from PHP docs
function ordinal($i = '') {
  $o=$i;
  $s=array('th', 'st', 'nd', 'rd');

  if(!is_int($o))
    if(ctype_digit($o))
      $o=(int)substr($o,-2,2);
    else
      return(false);
  return($i.$s[($o%100>10&&$o%100<20)?0:($o%10<4?$o%10:0)]);
}

これにより、出力が生成されます

Array
(
    [0] => Array
        (
            [score] => 4
            [text] => 1st Place
        )

    [1] => Array
        (
            [score] => 15
            [text] => 2nd Place
        )

    [2] => Array
        (
            [score] => 20
            [text] => 3rd Place
        )

    [3] => Array
        (
            [score] => 50
            [text] => 4th Place
        )

    [4] => Array
        (
            [score] => 100
            [text] => 5th Place
        )

)
于 2012-11-20T16:29:57.520 に答える
1
$newOrderarr = array();
$i = 0;
foreach ($newOptions as $k => $v){
    foreach ($v as $k2 => $v2){
        $newOrderarr[$i][$k2] = $k;
    }
    $i++;
}

しかし、それをテストする時間がありませんでした。

于 2012-11-20T16:35:38.980 に答える