Сортировка хэш-значений в алфавитном порядке [дубликат]

Каждый раз, когда вы получаете ...

"Warning: mysqli_fetch_object () ожидает, что параметр 1 будет mysqli_result, boolean задан«

... это, вероятно, из-за проблемы с вашим запросом. prepare() или query() могут возвращать FALSE (логическое), но это общее сообщение об отказе не оставляет вас в стороне от подсказок. Как вы узнаете, что не так с вашим запросом? Вы задаете !

Прежде всего убедитесь, что сообщения об ошибках включены и видны: добавьте эти две строки в начало файла (ов) сразу после открытия <?php:

error_reporting(E_ALL);
ini_set('display_errors', 1);

Если ваше сообщение об ошибках установлено в php.ini, вам не придется беспокоиться об этом. Просто убедитесь, что вы обрабатываете ошибки изящно и никогда не раскрываете истинные причины каких-либо проблем для ваших пользователей. Выявление истинной причины для общественности может быть приглашением на золото с гравировкой для тех, кто хочет нанести вред вашим сайтам и серверам. Если вы не хотите отправлять ошибки в браузер, вы всегда можете следить за журналами ошибок веб-сервера. Расположение журналов будет варьироваться от сервера к серверу, например, на Ubuntu журнал ошибок обычно находится в /var/log/apache2/error.log. Если вы изучаете журналы ошибок в среде Linux, вы можете использовать tail -f /path/to/log в окне консоли, чтобы видеть ошибки, когда они происходят в режиме реального времени .... или как вы их делаете.

Как только вы 'squared away на стандартном сообщении об ошибках, добавляющем проверку ошибок в вашем соединении с базой данных, и запросы дадут вам гораздо более подробную информацию о проблемах. Посмотрите на этот пример, где имя столбца неверно. Во-первых, код, возвращающий роковое сообщение об ошибке:

$sql = "SELECT `foo` FROM `weird_words` WHERE `definition` = ?";
$query = $mysqli->prepare($sql)); // assuming $mysqli is the connection
$query->bind_param('s', $definition);
$query->execute();

Ошибка является общей и не очень помогает вам в решении того, что происходит.

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

$sql = "SELECT `foo` FROM `weird_words` WHERE `definition` = ?";
if($query = $mysqli->prepare($sql)) { // assuming $mysqli is the connection
    $query->bind_param('s', $definition);
    $query->execute();
    // any additional code you need would go here.
} else {
    $error = $mysqli->errno . ' ' . $mysqli->error;
    echo $error; // 1054 Unknown column 'foo' in 'field list'
}

Если что-то не так, вы можете выплюнуть сообщение об ошибке, которое приведет вас к проблеме , В этом случае в таблице нет столбца foo, решение проблемы тривиально.

Если вы выберете, вы можете включить эту проверку в функцию или класс и расширить ее, обработав ошибки изящно, как упомянутых ранее.

119
задан jpwynn 21 December 2015 в 09:43
поделиться

6 ответов

Симпсоны:

array_of_hashes.sort_by { |hsh| hsh[:zip] }

Примечание:

При использовании sort_by вам нужно присвоить результат новой переменной: array_of_hashes = array_of_hashes.sort_by{} в противном случае вы можете использовать «bang "метод для изменения на месте: array_of_hashes.sort_by!{}

307
ответ дан Snowman 28 August 2018 в 16:03
поделиться

Если у вас есть Nested Hash (Хэш внутри хэш-формата) в качестве элементов массива (такая структура, как следующая), и вы хотите отсортировать ее по ключу (дата здесь)

data =  [
    {
        "2018-11-13": {
            "avg_score": 4,
            "avg_duration": 29.24
        }
    },
    {
         "2017-03-13": {
            "avg_score": 4,
            "avg_duration": 40.24
        }
    },
    {
         "2018-03-13": {
            "avg_score": 4,
            "avg_duration": 39.24
        }
    }
]

Использовать метод sort_by 'Array как

data.sort_by { |element| element.keys.first }
0
ответ дан Abhi 28 August 2018 в 16:03
поделиться

nil не сопоставимо, поэтому, чтобы избежать его

sorted = dataarray.sort do |a,b| 
  if a[:zip] == nil
    -1                       # nil gets to the start, swap if you need otherwise
  elsif b[:zip] == nil
     1
  else
    a[:zip] <=> b[:zip]
  end
end
0
ответ дан Amol Pujari 28 August 2018 в 16:03
поделиться

Используйте параметр bang для изменения массива:

array_of_hashes.sort_by!(&:zip)

Или переустановите его:

array_of_hashes = array_of_hashes.sort_by(&:zip)

Обратите внимание, что метод sort_by будет сортировать по возрастанию.

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

array_of_hashes.sort_by!(&:zip).reverse!

или

array_of_hashes = array_of_hashes.sort_by(&:zip).reverse
6
ответ дан Diego D 28 August 2018 в 16:03
поделиться

Если вы хотите разбивать страницы на данные в массиве, вы должны потребовать «will_paginate / array» в вашем контроллере

4
ответ дан eckes 28 August 2018 в 16:03
поделиться
sorted = dataarray.sort {|a,b| a[:zip] <=> b[:zip]}
16
ответ дан Edu 28 August 2018 в 16:03
поделиться
Другие вопросы по тегам:

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