2012-11-20 3 views
-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 
    ) 

) 

Идею это как использовать значение Array (?) как значение ключа и установить массив в следующем порядке:

Я пытаюсь с этим кодом (php)

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

Но и не работает отлично $ NewOptions является массив, который я использую для ...

+1

Что касается определения структуры данных в первую очередь (не говоря уже о том, что индекс, например, «4-е место», имеет гораздо меньше смысла, чем просто «4» –

+0

, в чем смысл этого делать? Было бы намного проще: $ arr [0] = 25; $ arr [1] = 15; $ arr [2] = 10; .... – Naryl

+0

Да, проблема в том, что это массив динамиков, значения могут меняться, поэтому идея создает что-то динамическое –

ответ

2

Вы можете попробовать это:

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

sort($your_array); 

Но я предпочел бы исправить структуру данных, чтобы начать с того, что, кажется, по крайней мере ... странно.

+0

Sweet. Мне это нравится. Я сделал что-то подобное, но без прохождения по ссылке. Никогда не думал об этом. +1 для сохранения памяти, не создавая новый массив. :) – keyboardSmasher

+0

Короткие и сладкие! просто работайте отлично! TY! –

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; 
+0

Спасибо, проблема в том, что массив динамически, иногда места или Призы (первое число в массиве) могут меняться, поэтому я не могу установить порядок непосредственно в коде. это число [25] => Array может быть 10 или 20, поэтому у меня есть порядок. Desc первое число всегда будет больше. –

+0

Мои первые несколько строк были только для проверки следующего кода. Какие числа используются doe не имеет значения для второй части. Но я (и, похоже, кто-то еще) не получает, что вы хотите сделать - и откуда приходит ваш начальный массив. – Jens

+0

Я получаю массив от внешнего поставщика данных, я преобразовал каждый массив в значение подэлемента и изменил ключ для естественного порядка, например, если значение равно 15 и 10 мест, которые плавают 15/в вы кодируете его, заказываете массив, но не группируете по местам ... –

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 
     ) 

) 
+0

Спасибо, проблема в том, что массив является динамически, иногда места или Призы (первое число в массиве) могут меняться, поэтому я не могу установить порядок прямой в коде. иногда это число [25] => Массив может быть 10 или 20, поэтому у меня есть порядок его Desc, первое число всегда будет больше. –

+0

Вот почему я использую sort() - значения не имеют значения. – Rawkode

+0

Я вижу, но проблема в том, что ваш массив $ score имеет другую структуру, чем у меня, я имею в виду, что я просто получаю массив $ newOptions точно так же, как я вставляю в свой пример, как я могу адаптировать ваш скрипт к работе с многомерным массивом вроде моего ? –

1
$newOrderarr = array(); 
$i = 0; 
foreach ($newOptions as $k => $v){ 
    foreach ($v as $k2 => $v2){ 
     $newOrderarr[$i][$k2] = $k; 
    } 
    $i++; 
} 

Не было времени, чтобы проверить это, хотя.

+0

он работает, но не так, как мне нужно, идея использует ту же структуру группы, что и я, но изменяю индекс каждого массива в порядке [0,1,2,3], не так, как сейчас. а затем добавьте индекс каждого массива внутри них, как пример, который я положил. –

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, чтобы сначала удалить пустые значения.

+0

Я сделал это в 8 строках простого кода 2 часа назад, и вы получаете преимущество. – keyboardSmasher

+0

@keyboardSmasher Вы сказали, что не успели протестировать свои. Я не только проверил мои, но и указал, какие потенциальные проблемы могут возникнуть у меня и как их исправить. –

+0

Хорошо для вас, я дам вам ваш первый законный аванс. Приветствия. +1 от меня. :) – keyboardSmasher

Смежные вопросы