2016-08-10 3 views
0

У меня есть ассоциативный массив, имеющий две разные цены с одним и тем же идентификатором. Пусть это будет ...Проверка повторяющихся значений в определенном ключе ассоциативного массива

Array ([0] => Array ([price] => 3800 [id] => 400015) 
     [1] => Array ([price] => 3700 [id] => 400015) 
     [2] => Array ([price] => 3300 [id] => 400018) 
     [3] => Array ([price] => 3000 [id] => 400018) 
     [4] => Array ([price] => 3100 [id] => 400020) 
     [5] => Array ([price] => 3400 [id] => 400020)) 

Мне нужно, чтобы отобразить их как

id:400015, Price=3800-3700 
id:400018, Price=3000-3600 
id:400020, Price=3100-3400 
+0

Loop массива в цикле и раздвигать элементы в качестве ключа Fo r Id и Prince для соответствующих идентификаторов. –

ответ

3

использования ниже, если array_column не поддерживает

$arr = Array ('0' => Array ('price' => 3800, 'id' => 400015) , 
     '1' => Array ('price' => 3700, 'id' => 400015), 
     '2' => Array ('price' => 3300, 'id' => 400018), 
     '3' => Array ('price' => 3000, 'id' => 400018), 
     '4' => Array ('price' => 3100, 'id' => 400020), 
     '5' => Array ('price' => 3400, 'id' => 400020),); 

     $new_arr =array(); 
     foreach($arr as $key=>$row){ 
      if(isset($new_arr[$row['id']])){ 
       $new_arr[$row['id']]= $new_arr[$row['id']].'-'.$row['price']; 
      }else{ 
       $new_arr[$row['id']]=$row['price']; 
      } 
     } 

     foreach($new_arr as $key=>$row){ 
      echo 'id:'.$key.', Price = '.$row.'<br>'; 
     } 
+0

Работает отлично, но мне тоже нужно сортировать значения цены –

+0

обновить, если инструкция с этим: $ new_arr [$ row ['id']] = (($ new_arr [$ row ['id']] <$ row ['price'])? ($ new_arr [$ row ['id']].'- '. $ row [' price ']): ($ row ['price'] .'- '. $ new_arr [$ row [' id ']])); –

+0

Отлично! Спасибо огромное! –

2

Вы можете массива цикл и создать новый массив, который будет легко создать вывод, который вы хотите показать

$newArray = array(); 
foreach($main as $key=>$val){ 
    $newArray[$val['id']][] = $val['price']; 
} 

foreach ($newArray as $key=>$val){ 
    sort($val,1); 
    echo 'id: '.$key.', Price='.implode('-', $val).'<br/>'; 
} 
+0

Он возвращает значения в том порядке, в котором они были в массиве, но мне тоже нужно сортировать значения цен. –

+0

@ VyshnaviSamudrala - вы можете коротко $ val во втором цикле до того, как имплодить, чтобы показать диапазон в правильном порядке: $ val = short ($ вал, 1); – Kashyap

+0

@ VyshnaviSamudrala - Я отредактировал ответ, вы можете проверить это для сортировки. – Kashyap

1

Петля по массиву и распечатать соответствующие id и price. Не слишком уверен, что вы делаете с вычитанием цены, но это должно дать вам то, что вам нужно.

$array = array(array('price'=>3800, 'id'=>40015), 
       array('price'=>3700 , 'id'=>40001), 
       array('price'=>3800, 'id'=>400015), 
       array('price'=>3300 , 'id'=>400018), 
       array('price'=>3000 , 'id'=>400018), 
       array('price'=>3100 , 'id'=>400020), 
       array('price'=>3400 , 'id'=>400020)); 

asort($array); 

foreach ($array as $key => $value) 
{ 
    echo 'id: '.$value['id'].', Price='.$value['price'].'<br />'; 
} 
+0

Это не вычитание цены, я пытаюсь сортировать значения цены от низкого до высокого –

+0

Я отредактировал свой пост, теперь он сортирует массив по цене перед его печатью. – XanT

+0

Не просто сортировка, мне нужно отображать цены на единый 'id' –

1

Просто, чтобы показать немного дисперсии, а также использовать функцию PHP7:

usort($data, function($a, $b) { return $a['price'] <=> $b['price']; }); 
$maxPrices = array_column($data, 'price', 'id'); 

usort($data, function($a, $b) { return $b['price'] <=> $a['price']; }); 
$minPrices = array_column($data, 'price', 'id'); 

foreach($minPrices as $id => $minPrice) { 
    echo 'id:', $id, ', Price=', $minPrice, '-', $maxPrices[$id], PHP_EOL; 
} 

Это использует usort() заказать массив по максимальной цене (с использованием нового «космического корабля» оператора); затем array_column(), чтобы создать массив значений id и max, так как там, где есть совпадающие идентификаторы, тогда цена будет переопределена предыдущими значениями, так что только самое высокое значение, соответствующее каждому из id, останется в массиве $maxPrices; то аналогично для минимальных значений.

Наконец цикл перебирает в мин массива, выборка каждого идентификатора и минимальную цену в своей очереди, и делает поиск ID, чтобы получить максимальную цену, чтобы отобразить

Demo

Обратите внимание, что использование оператора космического корабля требует PHP7

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