Как я могу отсортировать массив с указанием заданного числа

#php #arrays #sorting

#php #массивы #сортировка

Вопрос:

Прежде всего, я новичок в php. Мне нужна помощь для сортировки массива.

У меня есть массив идентификаторов и почтовых индексов, подобных этому:

 Array (
    [2286] => 3150-259 
    [2284] => 3040-256 
    [2282] => 5430-659 
    [2280] => 2560-270 
    [2278] => 3740-271 
    [2276] => 2495-401 ... and so on 
)
 

Теперь у меня есть число, скажем, «2900», я хотел бы отсортировать свой массив от ближайшего числа (2900) до самого дальнего.

Пример: число равно 2900. Итак, массив должен сортироваться следующим образом:

 Array (
   [2284] => 3040-256 
   [2286] => 3150-259 
   [2280] => 2560-270 
   [2276] => 2495-401 
   [2282] => 5430-659 ... and so on
 

Кто-нибудь может мне помочь?

Спасибо

Комментарии:

1. «Ближайший»? Численно? Расстояние? Как именно?

2. Можете ли вы отредактировать свои вопросы, чтобы они содержали пример, за которым следует ожидаемый результат. Трудно сказать, что вы хотите, как сейчас.

3. Ближайший номер, например, число 2900. Итак, массив должен сортироваться следующим образом: Array ([2284] => 3040-256 [2282] [2286] => 3150-259 [2284] [2280] => 2560-270 [2276] => 2495-401 [2282] => 5430-659 …

4. Я добавил ваш комментарий к вопросу, но он по-прежнему не имеет особого смысла. Пожалуйста, отредактируйте вопрос, не помещайте части вашего вопроса в комментарии.

5. Я предполагаю, что вы хотите посмотреть на первые 4 цифры вашего почтового индекса или цифры перед тире? Я также предполагаю, что вы хотите отсортировать численно , даже если вы говорите «расстояние»? Как они должны быть отсортированы: 3040-256 amp; 3040-128 ? Должен ли последний предшествовать первому, или порядок не имеет значения?

Ответ №1:

Я думаю, вы можете использовать функцию uksort следующим образом:

 <?php
$arr = [
    2286 => "3150-259",
    2284 => "3040-256",
    2282 => "5430-659",
    2280 => "2560-270",
    2278 => "3740-271",
    2276 => "2495-401",
];

$n = 2900;

uksort($arr, function ($a, $b) use ($n) {
    return (abs($a-$n) >= abs($b-$n)) ? 1 : -1;
});

var_export($arr);
 

Проверьте PHP-код здесь

Комментарии:

1. @Slava Rozhnev Это почти то, что я хочу, но вместо сортировки ключей я бы хотел отсортировать значения: D

2. Вы могли бы упростить выражение с помощью оператора spaceship return abs($a - $n) <=> abs($b - $n); .

3. @El_Vanja сработал как шарм. СПАСИБО ВАМ БОЛЬШОЕ

4. Если вам нужны значения, просто замените uksort на uasort .

5. Почтовые индексы не являются целыми числами, как предполагается в этом ответе.