2013-11-22 5 views
0

Я работаю с массивом, который я бы хотел фильтровать, поэтому он содержит только самые низкие цены за ключ. Таким образом, у 50 будет только одна единица, то же самое со 100, и эта единица будет самой низкой ценой.Фильтровать многомерный массив по самой низкой цене

Вот пример того, что я работаю с:

Array 
(
    [50] => Array 
     (
      [41788] => Array 
       (
        [StdRate] => 231.0000 
        [UnitName] => NN23 
       ) 

      [46238] => Array 
       (
        [StdRate] => 303.0000 
        [UnitName] => 1038 
       ) 

      [46207] => Array 
       (
        [StdRate] => 303.0000 
        [UnitName] => 1007 
       ) 
     ) 
    [100] => Array 
     (
      [41570] => Array 
       (
        [StdRate] => 299.0000 
        [UnitName] => HH18 
       ) 

      [46214] => Array 
       (
        [StdRate] => 388.0000 
        [UnitName] => 1014 
       ) 
     ) 
) 

Я хотел бы избежать этого со сложным контуром Еогеасп, поэтому я думал, что array_filter было бы хорошо, но с трудом оберточной мой голову вокруг него. Или лучше будет foreach?

$filtered = array_filter($units, function($a) { 

}); 
+0

Есть ли причина, вы не можете поместить все эти элементы в единый массив (значения, что есть), а затем использовать 'asort()' ?? – Crackertastic

+0

Лучший способ узнать, что лучше, является эталоном. Попробуйте и убедитесь сами: – Babblo

+0

Crackertastic, мне не нужно сортировать. Я просто хочу удалить все блоки, кроме самого дешевого устройства. – dallen

ответ

1

Вот функция, которая будет проходить через ваш многомерный массив и захватить самые низкие единицы. Он сохранит ключ большого массива (50, 100) и ключ блока, который он захватил (41788, 41570). Он не будет сохранить несколько значений той же низкой скорости. В этих случаях он вернет первое из самого низкого найденного значения. Не может быть именно то, что вы хотите, но это должно быть хорошим началом, и вы всегда можете изменить его позже. Он использует вложенный foreach, чтобы выполнить свою работу.

Надеюсь, что это поможет вам!

function findLows($big) { 
    $lowUnits = array(); 
    foreach($big as $id => $array) { 
     $low = false; 
     $prev = false; 
     foreach($array as $k => $a) { 
      if(!$low) { 
       $low = $k; 
       $prev = $a['StdRate']; 
      } else { 
       if($a['StdRate'] < $prev) { 
        $prev = $a['StdRate']; 
        $low = $k; 
       } 
      } 
     } 
     $lowUnits[$id] = array($low => $array[$low]); 
    } 
    return $lowUnits; 
} 

$bigArray = array(); 
$bigArray[50][41788] = array('StdRate' => 231.0000, 'UnitName' => "NN23"); 
$bigArray[50][46238] = array('StdRate' => 303.0000, 'UnitName' => "1038"); 
$bigArray[50][46207] = array('StdRate' => 303.0000, 'UnitName' => "1007"); 
$bigArray[100][41570] = array('StdRate' => 299.0000, 'UnitName' => "HH18"); 
$bigArray[100][46214] = array('StdRate' => 388.0000, 'UnitName' => "1014"); 

$filtered = findLows($bigArray); 

var_dump($filtered); 

будет производить:

array(2) { 
    [50]=> 
    array(1) { 
    [41788]=> 
    array(2) { 
     ["StdRate"]=> 
     float(231) 
     ["UnitName"]=> 
     string(4) "NN23" 
    } 
    } 
    [100]=> 
    array(1) { 
    [41570]=> 
    array(2) { 
     ["StdRate"]=> 
     float(299) 
     ["UnitName"]=> 
     string(4) "HH18" 
    } 
    } 
} 
+0

Спасибо, сэр/мэм! Это фантастика. – dallen

+0

Без проблем, этот сэр был рад помочь :-) – Crackertastic

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