$result = mysql_query('SELECT * FROM Users WHERE UserName LIKE $username');
Вы определяете строку, используя одинарные кавычки, и PHP не анализирует строки с разделителями одиночной кавычки. Чтобы получить переменную интерполяцию, вам нужно использовать двойные кавычки или конкатенацию строк (или их комбинацию). См. http://php.net/manual/en/language.types.string.php для получения дополнительной информации.
Также вы должны проверить, что mysql_query вернул действительный ресурс результата, иначе fetch_ *, num_rows и т. д. не будут работать с результатом, поскольку это не результат! IE:
$username = $_POST['username']; $password = $_POST['password']; $result = mysql_query('SELECT * FROM Users WHERE UserName LIKE $username'); if( $result === FALSE ) { trigger_error('Query failed returning error: '. mysql_error(),E_USER_ERROR); } else { while( $row = mysql_fetch_array($result) ) { echo $row['username']; } }
http://us.php.net/manual/en/function.mysql-query.php для получения дополнительной информации.
Вы можете использовать usort()
, чтобы точно определить способ сортировки массива. В этом случае массив $order
может использоваться в функции сравнения.
В приведенном ниже примере используется closure
, чтобы облегчить жизнь.
$order = array(3452342, 5867867, 7867867, 1231233);
$array = array(
array('id' => 7867867, 'title' => 'Some Title'),
array('id' => 3452342, 'title' => 'Some Title'),
array('id' => 1231233, 'title' => 'Some Title'),
array('id' => 5867867, 'title' => 'Some Title'),
);
usort($array, function ($a, $b) use ($order) {
$pos_a = array_search($a['id'], $order);
$pos_b = array_search($b['id'], $order);
return $pos_a - $pos_b;
});
var_dump($array);
Ключом к этой работе является сопоставление значений, являющихся позициями id
s в массиве $order
.
Функция сравнения работает путем нахождения позиций идентификаторы двух элементов, которые нужно сравнить в массиве $order
. Если $a['id']
приходит до $b['id']
в массиве $order
, то возвращаемое значение функции будет отрицательным ($a
меньше, поэтому «плавает» вверх). Если $a['id']
появляется после $b['id']
, функция возвращает положительное число ($a
больше, поэтому «опускается» вниз).
Наконец, нет особых причин использовать закрытие; это просто мой способ быстро написать эти виды отброшенных функций. Он также может использовать обычную именованную функцию.
Расширение ответа salathe для этого дополнительного требования:
Теперь, что происходит, когда я добавляю элементы в массив, а не в сортировку? Меня не волнует, какой порядок они появляются, если он приходит после тех, которые я указал.
blockquote>Вам нужно добавить два дополнительных условия в функцию сортировки:
- Элемент «dont care» должен считаться больше, чем «заботиться» о предметах
- . Два элемента «dont care» должны считаться равными
Поэтому пересмотренный код будет:
$order = array( 3452342, 5867867, 7867867, 1231233 ); $array = array( array("id" => 7867867, "title" => "Must Be #3"), array("id" => 3452342, "title" => "Must Be #1"), array("id" => 1231233, "title" => "Must Be #4"), array("id" => 5867867, "title" => "Must Be #2"), array("id" => 1111111, "title" => "Dont Care #1"), array("id" => 2222222, "title" => "Dont Care #2"), array("id" => 3333333, "title" => "Dont Care #3"), array("id" => 4444444, "title" => "Dont Care #4") ); function custom_compare($a, $b){ global $order; $a = array_search($a["id"], $order); $b = array_search($b["id"], $order); if($a === false && $b === false) { // both items are dont cares return 0; // a == b } else if ($a === false) { // $a is a dont care item return 1; // $a > $b } else if ($b === false) { // $b is a dont care item return -1; // $a < $b } else { return $a - $b; } } shuffle($array); // for testing var_dump($array); // before usort($array, "custom_compare"); var_dump($array); // after
Выход:
Before | After -------------------------------+------------------------------- array(8) { | array(8) { [0]=> | [0]=> array(2) { | array(2) { ["id"]=> | ["id"]=> int(4444444) | int(3452342) ["title"]=> | ["title"]=> string(12) "Dont Care #4" | string(10) "Must Be #1" } | } [1]=> | [1]=> array(2) { | array(2) { ["id"]=> | ["id"]=> int(3333333) | int(5867867) ["title"]=> | ["title"]=> string(12) "Dont Care #3" | string(10) "Must Be #2" } | } [2]=> | [2]=> array(2) { | array(2) { ["id"]=> | ["id"]=> int(1231233) | int(7867867) ["title"]=> | ["title"]=> string(10) "Must Be #4" | string(10) "Must Be #3" } | } [3]=> | [3]=> array(2) { | array(2) { ["id"]=> | ["id"]=> int(1111111) | int(1231233) ["title"]=> | ["title"]=> string(12) "Dont Care #1" | string(10) "Must Be #4" } | } [4]=> | [4]=> array(2) { | array(2) { ["id"]=> | ["id"]=> int(5867867) | int(2222222) ["title"]=> | ["title"]=> string(10) "Must Be #2" | string(12) "Dont Care #2" } | } [5]=> | [5]=> array(2) { | array(2) { ["id"]=> | ["id"]=> int(2222222) | int(1111111) ["title"]=> | ["title"]=> string(12) "Dont Care #2" | string(12) "Dont Care #1" } | } [6]=> | [6]=> array(2) { | array(2) { ["id"]=> | ["id"]=> int(3452342) | int(3333333) ["title"]=> | ["title"]=> string(10) "Must Be #1" | string(12) "Dont Care #3" } | } [7]=> | [7]=> array(2) { | array(2) { ["id"]=> | ["id"]=> int(7867867) | int(4444444) ["title"]=> | ["title"]=> string(10) "Must Be #3" | string(12) "Dont Care #4" } | } } | }
@salathe Для тех из вас, кто с трудом понимает, что делает usort salathe:
Каждый элемент в $ массиве является «чемпионом» в турнире, который должен быть в начале нового array (кроме вместо номера один они хотят быть числом 0).
$ a является домашним чемпионом, а $ b противником в матче.
$ pos_a и $ pos_b от обратного вызова - какие атрибуты будут использоваться в борьбе за чемпионов a и b. В этом случае этот атрибут является индексом идентификатора чемпиона в $ order.
Затем идет бой по возвращении. Теперь мы посмотрим, лучше ли более или менее атрибут. В битве за битву домашний чемпион хочет отрицательное число, поэтому он может быть скорее в массиве. Выездной чемпион хочет получить положительное число. И должно быть 0, это галстук.
Итак, следуя этой аналогии, когда атрибут «Чемпионы» (индекс в $ order) вычитается из атрибута home teams, чем больше атрибут «away», тем меньше вероятность выиграть, получив положительное число. Однако, если вы изменили способ использования атрибутов, теперь атрибут домашнего чемпиона вычитается из игры чемпиона. В этом случае большее число для чемпиона в гостях с большей вероятностью заставит его иметь конец конца в положительном числе.
Код будет выглядеть так:
note: код запускается многими раз, как настоящий турнир, имеет много битв, чтобы решить, кто первым (т. е. 0 / начало массива)
//tournament with goal to be first in array
usort($champions, function ($home, $away) use ($order) {
$home_attribute = array_search($a['id'], $order);
$away_attribute = array_search($b['id'], $order);
//fight with desired outcome for home being negative and away desiring positive
return $home_attribute - $away_attribute;
});
Вам нужно определить свою собственную функцию сравнения и использовать usort
или uasort
, если вы хотите поддерживать ассоциацию индексов.