2016-05-03 17 views
-1

私の関数の1つはこの配列を返します...はい私はここで他の例を見ましたが、私の問題を解決できる場所はありません。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) 

私が言おうとしています何

iが1をしたいということです...

「number_of_reffers」を使用して降順とasscendingで、この配列をソートする方法を知りたいでしょう一番最初に来るべき最も高いnumber_of_reffersで、次のように続きます。

これは可能ですか?これはどのようにPHPで行うことができますか?

ありがとうございました。

+0

...それがお役に立てば幸いです。それがあなたの問題を解決しなかった理由を説明できますか? –

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

は、私はあなたが見てきた他の例では、 `usort`が使用されていることを確信している

+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