Правила     Закладки     Карма    Календарь    Журналы    Помощь    Поиск    PDA    Чат   
        СМС-ки
   
Пейджер выключен!
Страницы: (2) [1] 2  ( Перейти к первому непрочитанному сообщению )  
Фильтр авторов:    показать 
  скрыть
  Закрытая темаСоздание новой темыСоздание опроса

> Сортировка массива по двум критериям
file_xz  
 ۩  [x] Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Новичок
*

Профиль
Группа: Пользователь
Сообщений: 21
Пользователь №: 35404
На форуме: 4 года, 9 месяцев, 8 дней
Карма: 1




Привет, существует массив $arr, мне его нужно отсортировать по значению (по убыванию), но еще отсортировать его по ключу (по возрастанию).

$arr=array(
1 => 2806,
2 => 2806,
3 => 1743,
4 => 581,
5 => 115,
6 => 1743,
7 => 1743);

//Мне нужно чтоб массив был отсортирован так:
$arr=array(
1 => 2806,
2 => 2806,
3 => 1743,
6 => 1743,
7 => 1743,
4 => 581,
5 => 115);


Как мне это сделать? arsort() сортирует значения по убыванию - но мне нужно чтоб еще и ключ был по возрастанию - если значение одинаковое с каким то другим элементом массива. Можно как то связать ksort() и arsort() вместе?


Конечно я могу сделать следующее:


$arr=array(
1 => 2806,
2 => 2806,
3 => 1743,
4 => 581,
5 => 115,
6 => 1743,
7 => 1743);

$arr2=array();

arsort($arr);

foreach($arr as $v => $v2){
if(!is_array($arr2[$v2])){
$arr2[$v2]=array($v);
}else{
$arr2[$v2][]=$v;
}
}


krsort($arr2);

unset($arr);
$arr=array();

foreach($arr2 as $v => $v2){
asort($v2);
foreach($v2 as $v3){
$arr[$v3]=$v;
}
}


foreach($arr as $v => $v2){
echo "$v => $v2<br>";
}



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


PMПисьмо на e-mail пользователю
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
exotica  
Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Code noobing... :))
******

Профиль
Группа: ★ЛжеЭксперт★
Завсегдатай форума
Сообщений: 740
Пользователь №: 36599
На форуме: 4 года, 5 месяцев, 7 дней
Карма: 22

Не курю:
4 года, 4 месяца, 25 дней


первое что приходит в голову это отсортировать значения по убыванию и просто создав новый массив перенести в него только отсортированные значения laugh.gif но могу заблуждаться давно php не открывал


--------------------
[FAQ]Регистрации пользователей, сохранение в БД
---------------------------------------------------------------------------
Выходя из ванной, вышел из нее два раза
PMПисьмо на e-mail пользователю
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
exotica  
Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Code noobing... :))
******

Профиль
Группа: ★ЛжеЭксперт★
Завсегдатай форума
Сообщений: 740
Пользователь №: 36599
На форуме: 4 года, 5 месяцев, 7 дней
Карма: 22

Не курю:
4 года, 4 месяца, 25 дней


епрст. все еще проще..rsort
$arr=array(
1 => 2806,
2 => 2806,
3 => 1743,
4 => 581,
5 => 115,
6 => 1743,
7 => 1743);

rsort($arr);

foreach($arr as $v => $v2){
echo "$v => $v2<br>";
}


результат:
0 => 2806
1 => 2806
2 => 1743
3 => 1743
4 => 1743
5 => 581
6 => 115


--------------------
[FAQ]Регистрации пользователей, сохранение в БД
---------------------------------------------------------------------------
Выходя из ванной, вышел из нее два раза
PMПисьмо на e-mail пользователю
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
sergeiss  
Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Сидел он, дум великих полон - и вдаль глядел
******

Профиль
Группа: Эксперт
Группа переписки
Сообщений: 15394
Пользователь №: 4190
На форуме: 9 лет, 5 месяцев, 17 дней
Карма: 470




file_xz, найди в хэлпе и открой для себя функцию usort().


--------------------
* Хэлп по PHP
* Описалово по JavaScript
* Хэлп и СУБД для PostgreSQL

* Обучаю PHP, JS, вёрстке. Интерактивно и качественно. За разумные деньги.

* "накапливаю умение телепатии" (С) и "гуглю за ваш счет" (С)

user posted image
PMICQ
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
file_xz  
 ۩  Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Новичок
*

Профиль
Группа: Пользователь
Сообщений: 21
Пользователь №: 35404
На форуме: 4 года, 9 месяцев, 8 дней
Карма: 1




Цитата (exotica @ 12.04.2016 - 17:31)
епрст. все еще проще..rsort
$arr=array(
1 => 2806,
2 => 2806,
3 => 1743,
4 => 581,
5 => 115,
6 => 1743,
7 => 1743);

rsort($arr);

foreach($arr as $v => $v2){
echo "$v => $v2<br>";
}


результат:
0 => 2806
1 => 2806
2 => 1743
3 => 1743
4 => 1743
5 => 581
6 => 115

Это не подходит, ключ важная для меня цифра, он идентификатор другого массива, и даже если отсортировать его с сохранением ключа "arsort()" сами ключи в разброс идут

Это сообщение отредактировал file_xz - 12.04.2016 - 18:37
PMПисьмо на e-mail пользователю
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
exotica  
Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Code noobing... :))
******

Профиль
Группа: ★ЛжеЭксперт★
Завсегдатай форума
Сообщений: 740
Пользователь №: 36599
На форуме: 4 года, 5 месяцев, 7 дней
Карма: 22

Не курю:
4 года, 4 месяца, 25 дней


Цитата
мне его нужно отсортировать по значению (по убыванию), но еще отсортировать его по ключу (по возрастанию).

тогда как это трактовать правильно? как вы предполагаете сделать две противоположных сортировки но сохранить и значения и ключи


--------------------
[FAQ]Регистрации пользователей, сохранение в БД
---------------------------------------------------------------------------
Выходя из ванной, вышел из нее два раза
PMПисьмо на e-mail пользователю
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
file_xz  
 ۩  Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Новичок
*

Профиль
Группа: Пользователь
Сообщений: 21
Пользователь №: 35404
На форуме: 4 года, 9 месяцев, 8 дней
Карма: 1




Цитата (sergeiss @ 12.04.2016 - 17:32)
file_xz, найди в хэлпе и открой для себя функцию usort().

usort($arr, можете подсказать что должно быть прописано здесь? для решения моей задачи)
PMПисьмо на e-mail пользователю
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
file_xz  
 ۩  Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Новичок
*

Профиль
Группа: Пользователь
Сообщений: 21
Пользователь №: 35404
На форуме: 4 года, 9 месяцев, 8 дней
Карма: 1




Цитата (exotica @ 12.04.2016 - 17:39)
Цитата
мне его нужно отсортировать по значению (по убыванию), но еще отсортировать его по ключу (по возрастанию).

тогда как это трактовать правильно? как вы предполагаете сделать две противоположных сортировки но сохранить и значения и ключи

Вот мой второй вариант с двумерным массивов работает так как мне нужно, но думаю что можно как то упростить задачу
PMПисьмо на e-mail пользователю
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
AllesKlar  
Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Здесь живет
******

Профиль
Группа: Форумчанин
Завсегдатай форума
Сообщений: 3706
Пользователь №: 38635
На форуме: 3 года, 6 месяцев, 26 дней
Карма: 198




file_xz
Цитата
$arr=array(
1 => 2806,
2 => 2806,
3 => 1743,
4 => 581,
5 => 115,
6 => 1743,
7 => 1743);

//Мне нужно чтоб массив был отсортирован так:
$arr=array(
1 => 2806,
2 => 2806,
3 => 1743,
6 => 1743,
7 => 1743,
4 => 581,
5 => 115);


Так то два ОДИНАКОВЫХ массива. biggrin.gif

Оттого, что ты сначала написал
1 => 100,
2 => 200

а потом
2 => 200,
1 => 100

Не изменилось абсолютно ничего.
Читается так: Элемент массива с ключем "1" равен 100, элемент массива с ключем "2" равен 200

Для обоих массивов сие справедливо.
А оттого, как ты на бамажечки нарисуешь порядок индексов, они ни в памяти машины ни изменяться, ни в функциях обработки.

Меняй логику, вылазь из говнокода.

Массив - это сущность, у которой есть ключ и значение для этого ключа, по которому (ключу) это значение доступно. Всё.

И не нужно пытаться из массива сделать что-то другое.


--------------------
[продано копирайтерам]
PMПисьмо на e-mail пользователю
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
sergeiss  
Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Сидел он, дум великих полон - и вдаль глядел
******

Профиль
Группа: Эксперт
Группа переписки
Сообщений: 15394
Пользователь №: 4190
На форуме: 9 лет, 5 месяцев, 17 дней
Карма: 470




file_xz, примеры показать не могу, пишу с телефона из больницы. На php.net/manual есть примеры в описании этой функции. Тут должна быть твоя функция, которая как раз задает правила сравненя элементов по определенному тобой алгоритму. Массив может быть хоть 10-кратной вложеннлсти smile.gif Задал правило - получил результат.


--------------------
* Хэлп по PHP
* Описалово по JavaScript
* Хэлп и СУБД для PostgreSQL

* Обучаю PHP, JS, вёрстке. Интерактивно и качественно. За разумные деньги.

* "накапливаю умение телепатии" (С) и "гуглю за ваш счет" (С)

user posted image
PMICQ
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
file_xz  
 ۩  Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Новичок
*

Профиль
Группа: Пользователь
Сообщений: 21
Пользователь №: 35404
На форуме: 4 года, 9 месяцев, 8 дней
Карма: 1




Цитата (AllesKlar @ 12.04.2016 - 18:25)
file_xz
Цитата
$arr=array(
1 => 2806,
2 => 2806,
3 => 1743,
4 => 581,
5 => 115,
6 => 1743,
7 => 1743);

//Мне нужно чтоб массив был отсортирован так:
$arr=array(
1 => 2806,
2 => 2806,
3 => 1743,
6 => 1743,
7 => 1743,
4 => 581,
5 => 115);


Так то два ОДИНАКОВЫХ массива. biggrin.gif

хм... Там же черным по белому написано что мне нужно отсортировать массив вот так! Это просто образец того что мне нужно, а не код.
Я не такой нуб в php, и у меня далеко не говнокод как вы выразились, у каждого своя логика и пишет он по разному.
Мой вопрос конечно звучит очень по нубски - так как я решаю проблемы по мере их появления, либо пишу свой код который решит мою проблему - подобие двумерному массиву написанному вверху.

Это сообщение отредактировал file_xz - 12.04.2016 - 21:03
PMПисьмо на e-mail пользователю
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
file_xz  
 ۩  Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Новичок
*

Профиль
Группа: Пользователь
Сообщений: 21
Пользователь №: 35404
На форуме: 4 года, 9 месяцев, 8 дней
Карма: 1




Цитата (sergeiss @ 12.04.2016 - 19:42)
file_xz, примеры показать не могу, пишу с телефона из больницы. На php.net/manual есть примеры в описании этой функции. Тут должна быть твоя функция, которая как раз задает правила сравненя элементов по определенному тобой алгоритму. Массив может быть хоть 10-кратной вложеннлсти smile.gif Задал правило - получил результат.

спасибо почитаю
PMПисьмо на e-mail пользователю
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
Ron  
Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Здесь живет
******

Профиль
Группа: Форумчанин
Завсегдатай форума
Сообщений: 1317
Пользователь №: 41686
На форуме: 1 год, 11 месяцев, 14 дней
Карма: 24




в реальной задаче ключи числовые? Если нет, то можно так:
array_multisort(array_values($arr), SORT_DESC, array_keys($arr), SORT_ASC, $arr);




--------------------
5.11.2017
PMПисьмо на e-mail пользователю
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
casper - gg  
Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Абориген
*****

Профиль
Группа: Пользователь
Сообщений: 216
Пользователь №: 42190
На форуме: 1 год, 7 месяцев, 18 дней
Карма: 10




неплохая штука этот - array_multisort, практически костыли в вопросе сортировки многомерных массивов и не нужны уж больше
PMПисьмо на e-mail пользователю
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
file_xz  
 ۩  Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Новичок
*

Профиль
Группа: Пользователь
Сообщений: 21
Пользователь №: 35404
На форуме: 4 года, 9 месяцев, 8 дней
Карма: 1




Цитата (Ron @ 12.04.2016 - 20:50)
в реальной задаче ключи числовые? Если нет, то можно так:
array_multisort(array_values($arr), SORT_DESC, array_keys($arr), SORT_ASC, $arr);

Числовые
PMПисьмо на e-mail пользователю
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:

Опции темыСтраницы: (2) [1] 2  Закрытая темаСоздание новой темыСоздание опроса