2015-12-19 5 views
0

Я много дней боролся с php-массивом. Каким-то образом я не получаю его, чтобы сортировать $ my_array.борется за дни, чтобы отсортировать массив php

То, что я хотел бы достичь, это:

  1. чтения данных из MySQL таблицы [который работает]
  2. место данные в my_array [который работает]
  3. вычислить значение, основанное на данных, которые стол и добавить, что в my_array [который работает]
  4. сортировки массива на «вычисленного» значение на шаге 3. [удалось этот]

I удалось 1 до 3, но не шаг 4.

ниже упрощен PHP кода

//table contents in mysql table 
//--------------------- 
//alfa, 5, 2 
//beta, 18, 3 
//gamma, 7, 2 
$q="SELECT * FROM model"; 
$result=mysql_query($q); 
$total=mysql_numrows($result); 

$i=0; 
while ($i<$total) 
    { 
    $modelname=mysql_result($status,$i,"modelname"); 
    $volume=mysql_result($result,$i,"volume"); 
    $force=mysql_result($result,$i,"force"); 

    $my_array[$i][0]=$modelname; 
    $my_array[$i][1]=$volume; 
    $my_array[$i][2]=$force; 

    //below the calculated value what I like to sort on later in the code 
    $my_array[$i][3]=$value1/$value2; /results are values like 2.5, 6, 3.5 

    $i++; 
} 

// contents of $my_array so far: 
//$i, $modelname, $volume, $force, calculated result 
//--------------------- 
// 0, alfa, 5, 2, 2.5 
// 1, beta, 18, 3, 6 
// 2, gamma, 7, 2, 3.5 
// now how to sort my_array on the last element [3]? 
// must I use sort, usort and how to sort on this fourth value? 


//epected result in my_array (sort ascending on the last element) 
//first element is the index in the array (used with $i) 
//--------------------- 
//0, alfa, 5, 2, 2.5 
//1, gamma, 7, 2, 3.5 
//2, beta, 18, 3, 6 
+0

Извлеките весь этот код MySQL, пожалуйста, и замените его примерами массивов, которые вы создаете вручную. Это означало бы, что мы могли бы запустить ваш код на наших машинах и протестировать исправление, что вы хотите. – TwoStraws

+0

Почему вы не сортируете данные по запросу MySQL? – splash58

+0

splash58: потому что то, что мне нравится сортировать, не является частью данных в базе данных. Вычисление является обязательным до его сортировки. – incognito

ответ

0

Вот простой код:

$my_array = array(
    array('alfa', 5, 2, 2.5), 
    array('beta', 18, 3, 6), 
    array('gamma', 7, 2, 3.5), 
); 

usort($my_array, function($a, $b) { return $a[3] - $b[3]; }); 
print_r($my_array); 

usort обратного вызова Объяснение:

  • , как описано в руководстве usort обратный вызов принимает два аргумента, которые являются некоторыми мс $my_array. Поскольку каждый элемент $my_array также является массивом, вы можете использовать стандартный синтаксис для доступа к элементам массива, в этом случае $a[3]

  • Далее, вам нужно вернуть результат сравнения. Как объяснено в ручном функции

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

Таким образом, вычитая $a[3] - $b[3] делает это. Если $a[3] < $b[3] - результат субтракции отрицательный, else - положительный, поэтому функция сравнения возвращает только то, что вам нужно. Конечно, вы можете использовать пример функции из PHP Manual и написать что-то вроде:

function($a, $b) { return $a[3] < $b[3]? -1 : 1; } 

и она по-прежнему будет работать, но $a[3] - $b[3] делает то же самое и занимает меньше кода.

+0

, этот usort выполняет эту работу, очень счастлив, но должен быть честным, что я еще не понимаю синтаксис (при чтении документации по usort). Я подозреваю, что return $ a [3] - $ b [3] означает сравнить значения 3-го (последнего) элемента в массиве (который мне нравится сортировать)? Глядя на http://php.net/manual/en/function.usort.php Я не могу сопоставить ваше решение с одним из примеров. – incognito

+0

@incognito Добавлено объяснение. –

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