2012-04-30 2 views
0

У меня есть массив с этими значениями:Максимальное значение для массива 2d с условием?

Array 
(
    [0] => Array 
    (
     [0] => John 
     [1] => 2012-03-29 
     [2] => 1 
    ) 
    [1] => Array 
    (
     [0] => Doe 
     [1] => 2012-03-30 
     [2] => 1 
    ) 
    [2] => Array 
    (
     [0] => John 
     [1] => 2012-03-31 
     [2] => 2 
    ) 
    [3] => Array 
    (
     [0] => Doe 
     [1] => 2012-03-31 
     [2] => 5 
    ) 
    [4] => Array 
    (
     [0] => John 
     [1] => 2012-04-02 
     [2] => 5 
    ) 
    [5] => Array 
    (
     [0] => John 
     [1] => 2012-04-02 
     [2] => 21 
    ) 
) 

Я пытаюсь получить максимальное значение array[][2] для каждой даты в array[][1].

Например, в массиве

Array[2][1] = 2012-03-31 | Array[2][2] = 2 
Array[3][1] = 2012-03-31 | Array[3][2] = 5 

Из этих двух одинаковых дней, я хочу, чтобы сохранить Array[3] и отбросить Array[2].

Я попробовал функцию Еогеасп:

foreach ($days as $k) { 
    $max_vals[] = array($k[0], $k[1], max($k[2])); 
} 

Но обнаружил, что не работает с днями. Как я могу отсортировать этот массив, сохраняя наибольшее значение для каждого дня, и отбросить остальное?

ответ

1

Следующий код будет перебирать каждое значение в $ data, либо добавляя новые встреченные даты в $cache, либо проверяя, больше ли он.

$cache = array(); 
// Note: $data is the array you provided above, replace with your variable name. 
foreach ($data as $k => $v) { 
    if (isset($cache[$v[1]])) { 
    if ($cache[$v[1]] < $v[2]) { 
     $cache[$v[1]] = $v[2]; 
    } 
    } else { 
    $cache[$v[1]] = $v[2]; 
    } 
} 

Когда закончено, $cache будет массив со значениями быть даты и ключи максимальное значение из array[][2].

1

Вот один из способов решить эту проблему:

  • Цикл по массиву с Еогеаспом

  • В группе петли Еогеаспа нового массив по имени, дата, номер

  • Сравнения с предыдущими значениями, если существует и перезаписывается, если номер больше

Надеюсь, это поможет.

1

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

$bigArray=array(
array('John','2012-03-29',1), 
array('Doe','2012-03-30',1), 
array('John','2012-03-31',2), 
array('Doe','2012-03-31',5), 
array('John','2012-04-02',5), 
array('John','2012-04-02',21), 
array('John','2012-03-07',21) 
); 
$output=array(); 
foreach($bigArray as $element){ 
if($element[1]>$output[$element[2]]){ 
$output[$element[2]]=$element[1]; 
}} 

echo '<pre>'; 
print_r($output); 

Этот выход:

Array 
(
    [1] => 2012-03-30 
    [2] => 2012-03-31 
    [5] => 2012-04-02 
    [21] => 2012-04-02 
) 

или получить обратное:

$bigArray=array(
    array('John','2012-03-29',1), 
    array('Doe','2012-03-30',1), 
    array('John','2012-03-31',2), 
    array('Doe','2012-03-31',5), 
    array('John','2012-04-02',5), 
    array('John','2012-04-02',21), 
    array('John','2012-03-07',20) 
    ); 
$output=array(); 
    foreach($bigArray as $element){ 
    if($element[2]>$output[$element[1]]){ 
    $output[$element[1]]=$element[2]; 
    }} 
echo '<pre>'; 
print_r($output); 

Печатается:

Array 
(
    [2012-03-29] => 1 
    [2012-03-30] => 1 
    [2012-03-31] => 5 
    [2012-04-02] => 21 
    [2012-03-07] => 20 
) 
Смежные вопросы