Данные JSON в сортировке php [дубликат]

$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 для получения дополнительной информации.

41
задан crmpicco 12 November 2015 в 15:13
поделиться

5 ответов

Вы можете использовать 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 больше, поэтому «опускается» вниз).

Наконец, нет особых причин использовать закрытие; это просто мой способ быстро написать эти виды отброшенных функций. Он также может использовать обычную именованную функцию.

86
ответ дан Ken Williams 3 September 2018 в 14:33
поделиться

Расширение ответа salathe для этого дополнительного требования:

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

Вам нужно добавить два дополнительных условия в функцию сортировки:

  1. Элемент «dont care» должен считаться больше, чем «заботиться» о предметах
  2. . Два элемента «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"
  }                            |    }
}                              |  }
13
ответ дан Community 3 September 2018 в 14:33
поделиться

@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;
    });
1
ответ дан Jason Basanese 3 September 2018 в 14:33
поделиться
1
ответ дан mickmackusa 3 September 2018 в 14:33
поделиться

Вам нужно определить свою собственную функцию сравнения и использовать usort или uasort , если вы хотите поддерживать ассоциацию индексов.

4
ответ дан Nev Stokes 3 September 2018 в 14:33
поделиться
Другие вопросы по тегам:

Похожие вопросы: