PHP многомерный массив сортировать и удалять строки - PullRequest
1 голос
/ 23 февраля 2012

У меня есть многомерный ассоциативный массив PHP со следующей структурой:

Fields: TYPE - COLOUR - SIZE - PRICE
[0] - rose, var2, var3, price
[1] - rose, var2, var3, price
[2] - daffodil, var2, var3, price
[3] - tulip, var2, var3, price
[4] - rose, var2, var3, price
[5] - tulip, var2, var3, price
[6] - daffodil, var2, var3, price

Я хочу просмотреть этот массив, и для каждого типа я хочу выбрать один с наименьшей ценой и удалить все остальные строкитакого типаКлючи не должны быть сохранены.

В конце я хочу массив только с одной строкой для каждого типа.

Я запутался в том, как это сделать, чтобы с благодарностью получали любые указатели.

РЕДАКТИРОВАТЬ: Извините, вероятно, сделал мой массив достаточно ясным, вот еще один фрагмент этого:

Fields: TYPE - COLOUR - SIZE - PRICE

[0] - type=>rose, colour=>var2, size=>var3, price=>£price
[1] - type=>rose, colour=>var2, size=>var3, price=>£price
[2] - type=>daffodil, colour=>var2, size=>var3, price=>£price
[3] - type=>tulip, colour=>var2, size=>var3, price=>£price
[4] - type=>rose, colour=>var2, size=>var3, price=>£price
[5] - type=>tulip, colour=>var2, size=>var3, price=>£price
[6] - type=>daffodil, colour=>var2, size=>var3, price=>£price

Ответы [ 4 ]

4 голосов
/ 23 февраля 2012

Ваша задача на самом деле не требует сортировки.Вы просто ищете самый низкий элемент (прилаг. Для каждого типа!) - это можно сделать (все еще!) За O (n).

$cheapest = array();

foreach ($flower as $id => $f) {
  $c_price = $cheapest[$f['type']]['price'];
  if (!$c_price || $f['price'] < $c_price) {
    $cheapest[$f['type']] = $f;
  }
}

print_r($cheapest);

Редактировать : измененомой ответ.Это создает ассоциативный массив, ключом которого является тип, а значением является исходный массив с наименьшей ценой.

Удачи!

2 голосов
/ 23 февраля 2012
<?php

// First, let's define the data we'll be working through.
$flowers = array(
    array('type'=>'rose',     'colour'=>'var2', 'size'=>'var3', 'price'=>'£9.99' ),
    array('type'=>'rose',     'colour'=>'var2', 'size'=>'var3', 'price'=>'£8.67'),
    array('type'=>'daffodil', 'colour'=>'var2', 'size'=>'var3', 'price'=>'£16.04'),
    array('type'=>'tulip',    'colour'=>'var2', 'size'=>'var3', 'price'=>'£4.39' ),
    array('type'=>'rose',     'colour'=>'var2', 'size'=>'var3', 'price'=>'£12.49'),
    array('type'=>'tulip',    'colour'=>'var2', 'size'=>'var3', 'price'=>'£4.49' ),
    array('type'=>'daffodil', 'colour'=>'var2', 'size'=>'var3', 'price'=>'£11.99'),
);

// Define the array which will store our final flower prices
$flower_prices = array();

// Loop through our flowers to find the lowest price.
foreach($flowers as $flower) {
    // Remove the pound from the price, and cast as a floating point decimal.
    $price = (float) str_replace('£', '', $flower['price']);
    if(!array_key_exists($flower['type'], $flower_prices)) {
        // First flower type encounter. By default, as of right now, this is the "cheapest".
        $flower_prices[$flower['type']] = $flower;
    } else if($price < (float) str_replace('£', '', $flower_prices[$flower['type']]['price'])) {
        // Flower type previously encountered, and the now encountered flower is cheaper.
        $flower_prices[$flower['type']] = $flower;
    }
}

// Now that we've determined which flowers are cheapest, we can print the results:
foreach($flower_prices as $price) {
    print $price['type'] . ': ' . $price['price'] . "\n";
}
2 голосов
/ 23 февраля 2012

Отредактированная версия решения Михаила для возврата того, о чем просил ОП.

$minid = array();
$minPrice = array();

foreach ($flower as $id => $f) {
  if (!isset($minPrice[$f['type']]) || $f['price'] < $minPrice[$f['type']]) {
    $minPrice[$f['type']] = $f['price'];
    $minid[$f['type']] = $id;
  }
}

$filtered = array();
foreach ($minid as $id)
  $filtered[] = $flower[$id];
0 голосов
/ 23 февраля 2012

Шаг Михаила на шаг вперед, и мы надеемся, что он будет в большей степени соответствовать тому, что вы просите:

    $selectedRows = array();
    foreach ($flower as $id => $f) {
       if( ! isset( $selectedRows[$f['type']] ) ) {
          $selectedRows[$f['type']]['id'] = $f['id'];
          $selectedRows[$f['type']]['price'] = $f['price'];
       } else {
           if ( $f['price'] < $selectedRows[$f['type']]['price'] ) {
             $selectedRows[$f['type']]['price'] = $f['price'];
             $selectedRows[$f['type']]['id'] = $f['id'];
           } 
       }
    }
    // Now you can look through the selectedRows, use the 
    foreach( $selectedRows as $v ){
        echo $flower[$v['id']].' $'.$v['price'].'<br />';
    }

Кроме того, если вы делаете свой массив следующим образом:

$ flower[0] ["rose"] ["blue"] ["large"] ["4.99"] = что угодно;

Я бы посоветовал изменить его на:

$ flower [0] => array ("type" => "rose", "color" => "blue", "size" => "large", "price" => "4.99");

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...