2016-01-14 3 views
0

У меня есть объект-дилер в моей базе данных, и у каждого дилера есть несколько марок автомобилей. У автомобилей есть разные цены на основе их набора функций. Ниже приводятся только две записи объекта дилера. Сначала я хочу сортировать дилеров с самыми низкими ценами. Как я могу это сделать?Сортировка массива объектов на основе вложенного ключа в php

Dealer Object 
    (
     [name] => Kosh Motors 
     [address] => NYC 
     [make] => Array 
      (
       [0] => Make Object 
        (
         [makeName] => Mercedes 
         [Prices] => Array 
          (
           [0] =>Price Object 
            (
             [makeDescription] => Some description here 
             [price] => 12400 
            ) 

           [1] =>Price Object 
            (
             [sDescription] => Variant with more features 
             [price] => 16600 

            ) 

          ) 

        ) 

      ) 

    ) 
    Dealer Object 
    (
     [name] => Majesty Motors 
     [address] => London, United Kingdom 
     [make] => Array 
      (
       [0] => Make Object 
        (
         [makeName] => BMW 
         [Prices] => Array 
          (
           [0] =>Price Object 
            (
             [makeDescription] => Some description here 
             [price] => 6400 
            ) 

           [1] =>Price Object 
            (
             [sDescription] => Variant with more features 
             [price] => 8700 

            ) 

          ) 

        ) 

      ) 

    ) 

Я попробовал usort, но его не работает учет с моим требованием. На самом деле это гнездо слишком сложно для меня. Я хочу, чтобы Majesty Motors Dealer появился первым после сортировки, потому что он имеет более низкие цены, чем Kosh Motors. Благодарим вас за помощь.

+0

Вы все равно можете использовать usort, но ваша функция сортировки должна сортироваться по «более низким ценам». Как * точно * вы хотите определить, что у Величества есть более низкие цены, которые Кош? (В этом примере величие явно ниже, но как насчет в общем смысле?) – jbafford

+0

Я хочу, если есть два таких же дилера, которые один из них предлагает самую низкую цену, независимо от марки. Только дилер, содержащий самые низкие цены, должен выглядеть первым –

+0

Хорошо, но что именно определяет «самые низкие цены»? Например, что, если у одного дилера есть [500, 1000], а у другого дилера - [100, 1200]? – jbafford

ответ

1

Таким образом, в вашем случае, когда сортировка на основе единой низкой абсолютной цене у дилера, ваша функция сортировки будет выглядеть примерно так:

<?php 

function lowestPriceForDealer($dealer) 
{ 
    $lowest = -1; 
    foreach($dealer->make as $makes) { 
     foreach($makes->Prices as $price) { 
      if($lowest == -1) 
       $lowest = $price; 
      else if($price < $lowest) 
       $lowest = $price; 
     } 
    } 

    return $lowest; 
} 

usort($arr, function($a, $b) { 
    return lowestPriceForDealer($a) <=> lowestPriceForDealer($b); 
}); 

Это не самый эффективный способ сделать это , но он будет работать.

lowestPriceForDealer возвращает самую низкую цену для дилера. Затем обратный вызов usort использует это для сортировки элементов в $arr.

(Более эффективная реализация может либо предварительно рассчитать самую низкую цену для каждого дилера, либо обновить объект дилера с минимальной ценой, а затем отсортировать на основе этого вместо того, чтобы пересчитывать минимальную цену на каждом этапе процесс сортировки. Если в вашем массиве ввода большое количество цен, вы захотите это сделать.)

+0

Большое вам спасибо ... –

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