2012-05-04 4 views
1

экспортировать из БД MySQL различной информации, которую я поставил внутри массива:PHP массив сортировать различные способы

$info=array(
(ID,CALORIES,PROTEIN,CARBOS,FIBER), 
... 
); 
ex: (1,270,24,12,5),(2,280,2,42,10),... 

Затем, далее по сценарию, мне нужно, чтобы получить идентификаторы 3 продуктов с самым высоким содержанием калорий , из 6 продуктов с самым высоким результатом 2xPROTEIN + 3xCARBOS и т. д. для 5 диаграмм.

Как я могу выполнить такую ​​сортировку массива, чтобы заполнить мои разные таблицы?

Функция sort() работает только для одномерного массива (если он работает для моего случая, я не знаю, какой будет синтаксис). Он также не работает для моих более сложных сортировок (2 * x + 3 * y) ...

ответ

3

Даже не то, что вы просите, я бы настоятельно предложил вам подготовить ваши таблицы в mysql (используя все формулы для сортировки и т. Д.). Основная задача Mysql - делать различные подборки и сортировку, я оставил бы для этого работу. Кроме того, передовые сортировки в MySQL является способ проще, чем думать алгоритмов или функций в PHP :)

SELECT * FROM `products` 
ORDER BY (2*PROTEIN+3*CARBOS) DESC 

Легко, как и никакой головной боли. Примените LIMIT 3 в конце, чтобы получить верхнюю 3. Обновление

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

SELECT * FROM (SELECT * FROM `products` WHERE `type`='fruit' LIMIT 6) a 
ORDER BY (2*PROTEIN+3*CARBOS) DESC LIMIT 3 
+0

Но если мой db содержит более 2 миллионов записей, я думаю, что с точки зрения производительности, мне было бы лучше с помощью PHP-решения, вы согласны? –

+1

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

+0

@Andrius Say Я получаю свои исходные результаты с помощью $ result3 = mysql_query ($ sql3), как бы вы «сортировали по определенному запросу»? –

1

Вы можете использовать array_multisort() для сортировки многомерных массивов. Синтаксис позволяет довольно гибко, см. the reference.

1

Вы можете использовать функцию usort:

function cmp($a, $b) 
{ 
    if( $a["calories"] *3+ $a["protein"]*2 == $b["calories"] *3+ $b["protein"]*2){ //do another comparison etc.. ; } 
    return ($a["calories"] *3+ $a["protein"]*2< $b["calories"] *3+ $b["protein"]*2)) ? -1 : 1; 
} 
usort($myarray,'cmp'); 
1

usort ваш друг здесь.

function sort2Protein3Carbo($a, $b) 
{ 
    // Assuming protein is the 2nd value in your array and carbo the 3rd. 
    $resA = 2 * $a[2] + 3 * $a[3]; 
    $resB = 2 * $b[2] + 3 * $b[3]; 

    if ($resA == $resB) 
     return 0; 

    return ($resA < $resB) ? -1 : 1; 
} 

usort($info, "sort2Protein3Carbo"); 
Смежные вопросы