2016-06-15 7 views
2

У меня есть массив выглядит как:Пользовательская сортировка массива в PHP

[0] => array(23 , 890) 
[1] => array(56 , 401) 
[2] => array(56 , 491) 
[3] => array(98 , 840) 
[4] => array(56 , 821) 
[5] => array(98 , 401) 
[6] => array(23 , 875) 

Я хочу, чтобы отсортировать данные по первому элементу, а затем второй, НО (здесь приходит вопрос на миллион долларов), когда второй элемент имеет число 9 в середине (x9x), я хочу отсортировать его последним. Как это:

[6] => array(23 , 875) 
[0] => array(23 , 890) // !!! 
[1] => array(56 , 401) 
[4] => array(56 , 821) // note that 821 is before 491, even though it is greater 
[2] => array(56 , 491) // !!! 
[5] => array(98 , 401) 
[3] => array(98 , 840) 

Я пытался возиться с usort (http://php.net/manual/en/function.usort.php), но без успеха. При сравнении $ a с $ b в cmp-функции я сделал:

if($a[0] > $b[0]) 
    return 1; 
elseif($a[0] < $b[0]) 
    return -1; 
else 
    if($a[1][1] == 9) // this did not do what I wanted 
     return 1; 
    if($a[1] > $b[1]) 
     return 1; 
    elseif($a[1] < $b[1]) 
     return -1; 
    else 
     return 0; 

Я действительно мог бы вам помочь!

+2

У вас 'var_dump ($ а [1] [1]) '? Возможно, это не то, что вы ожидаете, и вы должны явно преобразовать '$ a [1]' в строку? –

+1

'[1]' будет работать, только если значение представляет собой строку; поэтому сначала запишите число в строку. Также учтите, что '$ b' и/или * оба * элемента могут иметь' 9' в середине, и в этом случае вам нужно вернуть '-1' и' 0' соответственно. – deceze

+0

'strval ($ a [1]) [1] == 9' должен заставить его работать – SeinopSys

ответ

0

Это работает нормально для меня, см https://3v4l.org/jufbu

<?php 
uasort($arr, function ($a, $b) { 
    if($a[0] != $b[0]) 
     return $a[0] - $b[0]; 
    else 
     if(strval($a[1])[1] == 9) 
      return 1; 
     else 
      return $a[1] - $b[1]; 
}); 
+0

Это действительно работает. Спасибо! – f0YAVo

-3

вы можете изменить ключ как первое значение в массиве и отсортировать массив по ключу.

<?php 

$yourArray = array(
    array(23 , 890), 
    array(56 , 401), 
    array(56 , 491), 
    array(98 , 840), 
    array(56 , 821), 
    array(56 , 821), 
    array(23 , 875) 
); 

$resultArray = array(); 

foreach($yourArray as $_key => $_childArray) { 
    $key = $_childArray[0].'.'.$_key; 

    if(strpos($_childArray[1],'9')) { 
     $key = $_childArray[0].'.9'.$_key; 
    } 

    $resultArray[$key] = $_childArray; 
} 

ksort($resultArray); 

print_r($resultArray); 

видеть, когда http://sandbox.onlinephpfunctions.com/code/238ca95a59c7bc4cd6f1e23d99d3d91021825503

+1

Я не думаю, что это учитывает '9' в середине чисел – Dale

+0

А как насчет' когда второй элемент имеет число 9 в середине (x9x), я хочу отсортировать его последним. '? –

+0

Я отредактировал мой ответ, почему downvote? – Naumov

0

В функции, которые вы используете для usort, используйте этот

if($a[0] > $b[0]) 
    return 1; 
else if($a[0] < $b[0]) 
    return -1; 
else if($a[1]%10 == 9) 
    return -1; 
if($a[1] > $b[1]) 
    return 1; 
if($a[1] < $b[1]) 
    return -1; 
else 
    return 0; 
+0

Не забудьте [указать свой код] (http://meta.stackexchange.com/questions/90407/easy-way-to-indent-code), он станет более читаемым! – Timothy

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