2016-05-03 2 views
-1

Одна из моих функций возвращает этот массив ... Да, я видел другие примеры здесь, на SO, но не смог решить мою проблему.Сортировка многомерных массивов в php

array (size=4) 
    0 => 
    array (size=2) 
     'refferrer' => string 'http://google.com/' (length=18) 
     'number_of_reffers' => string '15' (length=2) 
    1 => 
    array (size=2) 
     'refferrer' => string 'https://facebook.com/' (length=21) 
     'number_of_reffers' => string '22' (length=2) 
    2 => 
    array (size=2) 
     'refferrer' => string 'none' (length=4) 
     'number_of_reffers' => string '74' (length=2) 
    3 => 
    array (size=2) 
     'refferrer' => string 'http://findy.com/' (length=17) 
     'number_of_reffers' => string '6' (length=1) 

Я хотел бы знать, как сортировать этот массив в порядке убывания и asscending порядок использования

«number_of_reffers» ...

То, что я пытаюсь сказать, что я хочу один с наивысшим номером_результаты, чтобы прийти первым, следовать следующему и так далее.

Возможно ли это, и как я могу это сделать в php.

Спасибо вам за помощь.

+0

Я уверен, что в других примерах вы видели, 'usort' был использован. Можете ли вы объяснить, почему это не решило вашу проблему? –

+0

@ Don'tPanic Я понятия не имею, почему они не работают, но используя ответы ниже, особенно тот, который я принял, объяснил это лучше, а также помог мне понять [PHP: usort Manuel] (http://php.net/manual /en/function.usort.php). Спасибо. – Ukor

ответ

1

В самом простом смысле слова; Вы можете просто хотите попробовать это:

<?php 
     // SORTING ALGORITHM: 
     // TO SORT IN THE OPPOSITE SENSE... 
     // (IE. ASCENDING [AS OPPOSED TO THE DEFAULT: DESCENDING] 
     // CHANGE THE LESS THAN (<) BELOW TO GREATER THAN (>) 
     function orderByNumRef($arrPrev, $arrNext) { 
      if ($arrPrev['number_of_reffers'] == $arrNext['number_of_reffers']) { 
       return 0; 
      } 
      return ($arrPrev['number_of_reffers'] < $arrNext['number_of_reffers']) ? -1 : 1; 
     } 

     //GIVEN ARRAY - DYNAMIC OR HARD-CODED 
     $arr = array(
      array(
       'refferrer'   => 'http://google.com/', 
       'number_of_reffers' =>'15', 
      ), 
      array(
       'refferrer'   => 'https://facebook.com/', 
       'number_of_reffers' =>'74', 
      ), 
      array(
       'refferrer'   => 'http://findy.com/', 
       'number_of_reffers' =>'6', 
      ), 
     ); 


     //BEFORE SORTING: 
     var_dump($arr); 



     uasort($arr, 'orderByNumRef'); 

     //AFTER SORTING: 
     var_dump($arr); 

Надеется, что это помогает ...

+0

Это потрясающе ... Да, это помогло – Ukor

-1

Самый простой способ найти это - создать новый массив с ключом number_of_reffers. Затем отсортируйте новый массив либо с ksort(), либо с krsort(). Это, в конце концов, оставляет исходный массив неповрежденным. В противном случае было бы лучше создать исходный массив в предполагаемом формате.

<?php 
// original array 
$array = array(
    array('refferrer' => 'http://google.com/', 'number_of_reffers' => '15'), 
    array('refferrer' => 'https://facebook.com/', 'number_of_reffers' => '22'), 
    array('refferrer' => 'none', 'number_of_reffers' => '74'), 
    array('refferrer' => 'http://findy.com/', 'number_of_reffers' => '6') 
); 

$foo = array(); // new empty array 

// loop through $array, assign the number_of_reffers as the key for the refferrer 
foreach ($array as $key => $bar) { 
    $foo[$bar['number_of_reffers']] = $bar['refferrer']; 
} 

/* 
    new array will be: 
    array(
     '15' => 'http://google.com/', 
     '22' => 'https://facebook.com/' 
     etc ..... 
    ) 
*/ 


// use Ksort/Krsort to sort the key asc or desc 
ksort($foo); // ascending order 
#krsort($foo); // descending order 

die('<pre>'.print_r($foo, true).'</pre>'); // pretty printing of sorted array 
?> 

Как функция ....

<?php 

Function Referrer_sort($array, $asc = true) { 

    IF (!is_array($array)) { return 'not an array'; } 

    $result = array(); 
    foreach ($array as $key => $value) { 
     $result[$value['number_of_reffers']] = $value['refferrer']; 
    } 

    switch ($asc) { 
     case false: krsort($result); return $result; 
     default: ksort($result); return $result; 
    } 

} 

$foo_asc = Referrer_sort($array); 
$foo_desc = Referrer_sort($array, false); 

die('<pre>Ascending:<br>'.print_r($foo_asc, true).'<br>Descending:<br>'.print_r($foo_desc, true).'</pre>'); 

?> 

Изменение исходного массива

модифицируя исходный массив путем изменения индексного ключа со значением number_of_reffers.

<?php 

Function Rebuild_Referrer_sort($array, $asc = true) { 

    IF (!is_array($array)) { return 'not an array'; } 

    $result = array(); 
    foreach ($array as $key => $value) { 
     $result[$value['number_of_reffers']] = array('refferrer' => $value['refferrer'], 'number_of_reffers' => $value['number_of_reffers']); 
    } 

    switch ($asc) { 
     case false: krsort($result); return $result; 
     default: ksort($result); return $result; 
    } 

} 


$foo_asc = Rebuild_Referrer_sort($array); 
$foo_desc = Rebuild_Referrer_sort($array, false); 

die('<pre>Ascending:<br>'.print_r($foo_asc, true).'<br>Descending:<br>'.print_r($foo_desc, true).'</pre>'); 

/** 
    Returns: 

Ascending: 
Array 
(
    [6] => Array 
     (
      [refferrer] => http://findy.com/ 
      [number_of_reffers] => 6 
     ) 

    [15] => Array 
     (
      [refferrer] => http://google.com/ 
      [number_of_reffers] => 15 
     ) 

    [22] => Array 
     (
      [refferrer] => https://facebook.com/ 
      [number_of_reffers] => 22 
     ) 

    [74] => Array 
     (
      [refferrer] => none 
      [number_of_reffers] => 74 
     ) 

) 

Descending: 
Array 
(
    [74] => Array 
     (
      [refferrer] => none 
      [number_of_reffers] => 74 
     ) 

    [22] => Array 
     (
      [refferrer] => https://facebook.com/ 
      [number_of_reffers] => 22 
     ) 

    [15] => Array 
     (
      [refferrer] => http://google.com/ 
      [number_of_reffers] => 15 
     ) 

    [6] => Array 
     (
      [refferrer] => http://findy.com/ 
      [number_of_reffers] => 6 
     ) 

) 
*/ 

?> 
+0

Хотя этот код может ответить на вопрос, предоставив дополнительный контекст относительно _why_ и/или _how_ он отвечает , вопрос значительно улучшит его долгосрочное значение . Пожалуйста, отредактируйте свой ответ, чтобы добавить какое-то объяснение. –

+0

обновлен в соответствии с запросом. – Brian

-1

Попробуйте это:

<?php 

$my_array; 

//Sort Acceding 
usort($my_array, create_function('$a,$b', 'return (Int)$a["number_of_reffers"]-(Int)$b["number_of_reffers"];')); 

//Or sort Descending 
usort($my_array, create_function('$a,$b', 'return (Int)$b["number_of_reffers"]-(Int)$a["number_of_reffers"];')); 
3

Вам нужно usort

Учитывая ваш массив, вы бы тогда сделать это:

usort($array, 'sort_by_referrer_count'); 

var_dump($array); 

// This will sort ascending 
function sort_by_referrer_count($a, $b) { 
    // Some defensive coding to ensure keys exist 
    $a = (isset($a['number_of_referrers'])) ? $a['number_of_referrers'] : 0; 
    $b = (isset($b['number_of_referrers'])) ? $b['number_of_referrers'] : 0; 

    if ($a == $b) { 
     return 0; 
    } 
    return ($a < $b) ? -1 : 1; 
} 

Если вы хотите убыванию, то вы мог бы сделать это (используя ту же функцию выше):

usort($array, 'sort_by_referrer_count'); 
$array = array_reverse($array); 
+0

Теперь я вижу, что вы сделали ... Это сработало ...Спасибо – Ukor

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