2015-02-16 5 views
0

У меня есть массив как это:ранжирования/положения на многомерном массиве

Array 
(
    [1] => Array 
     (
      [0] => Array 
       (
        [user_id] => 13162 
        [selling_points] => 110.2 
        [total_points] => 189.6 
        [contest_name] => Gold 
       [position_selling] => 0 
       [position_final] => 0 
      ) 

     [1] => Array 
      (
       [user_id] => 16712 
       [selling_points] => 80.4 
       [total_points] => 90.3 
       [contest_name] => Gold 
       [position_selling] => 0 
       [position_final] => 0 
      ) 
    ) 

[2] => Array 
    (
     [0] => Array 
      (
       [user_id] => 24613 
       [selling_points] => 1400.72 
       [total_points] => 1978.29 
       [contest_name] => Silver 
       [position_selling] => 0 
       [position_final] => 0 
      ) 
     [1] => Array 
      (
       [user_id] => 41317 
       [selling_points] => 775.33 
       [total_points] => 847 
       [contest_name] => Silver 
       [position_selling] => 0 
       [position_final] => 0 
      ) 
     [2] => Array 
      (
       [user_id] => 41045 
       [selling_points] => 655.03 
       [total_points] => 1065 
       [contest_name] => Silver 
       [position_selling] => 0 
       [position_final] => 0 
      ) 
     ) 
) 

Я хотел бы назначить 2 вида позиций по значениям selling_points (position_selling) и total_points (position_final).

Результат должен быть что-то вроде этого:

Array 
(
    [1] => Array 
     (
      [0] => Array 
       (
       [user_id] => 13162 
       [selling_points] => 110.2 
       [total_points] => 189.6 
       [contest_name] => Gold 
       [position_selling] => 1 
       [position_final] => 1 
      ) 

     [1] => Array 
      (
       [user_id] => 16712 
       [selling_points] => 80.4 
       [total_points] => 90.3 
       [contest_name] => Gold 
       [position_selling] => 2 
       [position_final] => 2 
      ) 
    ) 

[2] => Array 
    (
     [0] => Array 
      (
       [user_id] => 24613 
       [selling_points] => 1400.72 
       [total_points] => 1978.29 
       [contest_name] => Silver 
       [position_selling] => 1 
       [position_final] => 1 
      ) 

     [2] => Array 
      (
       [user_id] => 41045 
       [selling_points] => 655.03 
       [total_points] => 1065 
       [contest_name] => Silver 
       [position_selling] => 3 
       [position_final] => 2 
      ) 

     [3] => Array 
      (
       [user_id] => 41317 
       [selling_points] => 775.33 
       [total_points] => 847 
       [contest_name] => Silver 
       [position_selling] => 2 
       [position_final] => 3 
      ) 
     ) 
) 

я уже судимым использовать функции PHP как usort и array_multisort, но без успеха ... Кто-то может мне помочь?

ответ

0
<?php 
$data = getData(); 
$s1 = array(); 
foreach($data as &$v) { 
    $s1[] = &$v; 
} 
$s2 = $s1; 
usort($s1, compareBy('selling_points')); 
usort($s2, compareBy('total_points')); 

markPosition($s1, 'position_selling'); 
markPosition($s2, 'position_final'); 

echo '$data=', var_export($data); echo ";\r\n\r\n"; 


function markPosition(array $arr, $key) { 
    foreach($arr as $v=>&$k) { 
     $k[$key] = $v+1; 
    } 
} 

function compareBy($key) { 
    return function($a,$b) use($key) { 
     return $b[$key] - $a[$key]; 
    }; 
} 


function getData() { 
    return [ 
     [ 
      'user_id' => 1, 
      'selling_points' => 1, 
      'total_points' => 1, 
     ], 
     [ 
      'user_id' => 2, 
      'selling_points' => 4, 
      'total_points' => 4, 
     ], 
     [ 
      'user_id' => 3, 
      'selling_points' => 3, 
      'total_points' => 5, 
     ], 
    ]; 
} 

Не успел пояснить это прямо сейчас (напомните мне завтра, если вы хотите объяснить). И/или ждать лучшего решения .... ;-)
Я оставил один уровень гнездования вашего массива, но это должно быть тривиально.

см http://docs.php.net/references
и не попробовать его без функции markPosition(), или вы, вероятно, в конечном итоге с неожиданным поведением из-за ссылок в цикле Еогеасп ....

0

Как я вижу @ VlkerK уже дал вам почти тот же ответ, что и я.

$arr = [ 
     [ 
      ['user_id' => 13162, 
      'selling_points' => 110.2, 
      'total_points' => 189.6, 
      'contest_name' => 'Gold', 
      'position_selling' => 0, 
      'position_final' => 0 
      ], 
      ['user_id' => 16712, 
      'selling_points' => 80.4, 
      'total_points' => 90.3, 
      'contest_name' => 'Gold', 
      'position_selling' => 0, 
      'position_final' => 0 
      ] 
     ], 
     [ 
      ['user_id' => 24613, 
      'selling_points' => 1400.72, 
      'total_points' => 1978.29, 
      'contest_name' => 'Silver', 
      'position_selling' => 0, 
      'position_final' => 0 
      ], 
      ['user_id' => 41317, 
      'selling_points' => 775.33, 
      'total_points' => 847, 
      'contest_name' => 'Silver', 
      'position_selling' => 0, 
      'position_final' => 0 
      ], 
      ['user_id' => 41045, 
      'selling_points' => 655.03, 
      'total_points' => 1065, 
      'contest_name' => 'Silver', 
      'position_selling' => 0, 
      'position_final' => 0 
      ] 
     ] 
     ]; 

$newArr = array(); 

function cmp($a, $b) 
{ 
    if ($a['selling_points'] == $b['selling_points']) { 
     return 0; 
    } 
    return ($a['selling_points'] < $b['selling_points']) ? 1 : -1; 
} 

function cmpTotal($a, $b) 
{ 
    if ($a['total_points'] == $b['total_points']) { 
     return 0; 
    } 
    return ($a['total_points'] < $b['total_points']) ? 1 : -1; 
} 

foreach($arr as $contest) { 

    usort($contest,'cmp'); 
    $byTotal = $contest; 
    usort($byTotal,'cmpTotal'); 
    $iTotal=1; 
    foreach($byTotal as &$user) { 
     $i = array_search($user,$contest); 
     $user['position_selling'] = $i+1; 
     $user['position_final'] = $iTotal++; 
    } 
    $newArr[] = $byTotal; 
} 

print_r($newArr); 
Смежные вопросы