Модераторы: skyboy, MoLeX, Aliance, ksnk
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> сортировка массива по ключам 
V
    Опции темы
Gold Dragon
Дата 18.7.2012, 07:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Призрачный
****


Профиль
Группа: Экс. модератор
Сообщений: 6753
Регистрация: 1.3.2004
Где: Россия, Тамбов

Репутация: 10
Всего: 71



Есть массив с данными
Цитата

Array(
   a1=1
   a2=2
   a3=3
   a4=4
   a5=5
)

и имеется массив в котором перечислены ключи в том порядке в котором нужно отсортировать массив с данными
Цитата

Array(
   a3
   a2
   a5
)

Оставшиеся данные просто добавляются в конец.. Т.е. должно получится следующее
Цитата

Array(
   a3=3
   a2=2
   a5=5
   a1=1
   a4=4
)


На ум приходит только следующий механизм:
- Прогоняем второй массив циклом
- При нахождении в первом массиве совпадение добавляем пару ключ-значение в новый массив, при этом удаляем эту пару из первого массива
- После прогона добавляем к новому массиву остаток от первого
- Удаляем первый массив.

Есть какие-нибудь мысли по этому поводу?



--------------------
Нельзя жить в прошлом, оно уже прошло.
Нельзя жить в будущем, оно ещё не наступило.
Нужно жить в настоящем, помня прошлое и думая о будущем!
PM MAIL WWW ICQ   Вверх
baldina
Дата 18.7.2012, 09:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3433
Регистрация: 5.12.2007
Где: Москва

Репутация: 26
Всего: 101



Есть. Ничего добавлять/удалять не надо, надо просто отсортировать первый массив с использованием пользовательской функции, которая будет консультироваться у второго массива.
PM MAIL   Вверх
Gold Dragon
Дата 18.7.2012, 14:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Призрачный
****


Профиль
Группа: Экс. модератор
Сообщений: 6753
Регистрация: 1.3.2004
Где: Россия, Тамбов

Репутация: 10
Всего: 71



baldina, да что-то никак не могу сообразить как всё это с организовать...

Сейчас делаю вот так
Код

$aa = array(
    'a1'=>1,
    'a2'=>2,
    'a3'=>3,
    'a4'=>4,
    'a5'=>5,
    'a6'=>6,
    'a7'=>7,
    'a8'=>8,
);
$bb = array(
    'a7',
    'a4',
    'a1',
    'a8'
);

$cc = array();
foreach($bb as $b){
    if(array_key_exists($b, $aa)){
        $cc[$b] = $aa[$b];
        unset($aa[$b]);
    }
}
$aa = array_merge($cc, $aa);
unset($cc);
print_r($aa);



--------------------
Нельзя жить в прошлом, оно уже прошло.
Нельзя жить в будущем, оно ещё не наступило.
Нужно жить в настоящем, помня прошлое и думая о будущем!
PM MAIL WWW ICQ   Вверх
Evghenusi
Дата 18.7.2012, 14:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


майский жук
**


Профиль
Группа: Участник
Сообщений: 506
Регистрация: 3.8.2006
Где: Молдова, Кишинёв

Репутация: 6
Всего: 15



Gold Dragon, эту тему смотрел?
мне кажется тоже самое, хотя могу ошибаться, не вникал(
PM WWW   Вверх
Gold Dragon
Дата 18.7.2012, 14:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Призрачный
****


Профиль
Группа: Экс. модератор
Сообщений: 6753
Регистрация: 1.3.2004
Где: Россия, Тамбов

Репутация: 10
Всего: 71



Evghenusi, ты прав, тоже самое.. и если я правильно понял, то мой вариант наилучшее решение на сегодня. И понятнее и быстрее скорее всего (хотя как проверить не знаю пока)


--------------------
Нельзя жить в прошлом, оно уже прошло.
Нельзя жить в будущем, оно ещё не наступило.
Нужно жить в настоящем, помня прошлое и думая о будущем!
PM MAIL WWW ICQ   Вверх
baldina
Дата 18.7.2012, 15:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3433
Регистрация: 5.12.2007
Где: Москва

Репутация: 26
Всего: 101



Код

$aa = array(
    'a1'=>1,
    'a2'=>2,
    'a3'=>3,
    'a4'=>4,
    'a5'=>5,
    'a6'=>6,
    'a7'=>7,
    'a8'=>8,
);
$bb = array(
    'a7',
    'a4',
    'a1',
    'a8'
);

$count = count ($bb);
uksort ($aa, function ($x, $y) use ($bb, $count) {
  $kx = array_search ($x, $bb);
  $ky = array_search ($y, $bb);
  if ($kx === false) $kx = $count;
  if ($ky === false) $ky = $count;
  return $kx-$ky;
});
print_r($aa);


Добавлено через 1 минуту и 30 секунд
для старых версий пхп
Код

function compare ($x, $y) {
  global $bb, $count;
  $kx = array_search ($x, $bb);
  $ky = array_search ($y, $bb);
  if ($kx === false) $kx = $count;
  if ($ky === false) $ky = $count;
  return $kx-$ky;
}

uksort ($aa, 'compare');

PM MAIL   Вверх
Gold Dragon
Дата 18.7.2012, 15:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Призрачный
****


Профиль
Группа: Экс. модератор
Сообщений: 6753
Регистрация: 1.3.2004
Где: Россия, Тамбов

Репутация: 10
Всего: 71



так.. привожу результаты теста...

Первый массив содержал 1000 записей по типу
Цитата

array(
   a1 => 1
   ............
   a1000 => 1000
)

Второй массив имел обратную сортировку
Цитата

array(
   a1000
   ............
   a1
)


В тестах использовал свой код и код приведённый baldina

Память оба кода используют одинаково, у меня получилось 0,18Мб. А вот скорость ОГОГО какая разница..

Мой код в среднем показал результат 0,004
Код baldina показал 2,055

То есть мой код получился более чем в 500 раз быстрее  smile

Добавлено @ 15:50
Извиняюсь за неточность... 

Код для "старых версий" показал в среднем 2,055

А вот для новых версий значительно лучше - 0,545, т.е. всего в 136 раз медленнее

 smile 

Это сообщение отредактировал(а) Gold Dragon - 18.7.2012, 15:51


--------------------
Нельзя жить в прошлом, оно уже прошло.
Нельзя жить в будущем, оно ещё не наступило.
Нужно жить в настоящем, помня прошлое и думая о будущем!
PM MAIL WWW ICQ   Вверх
baldina
Дата 18.7.2012, 16:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3433
Регистрация: 5.12.2007
Где: Москва

Репутация: 26
Всего: 101



неудивительно, т.к. сортировка nlog(n), а алгоритм Gold Dragon линейный. плюс array_search имеет линейную производительность, итого n^2*log(n) vs n
PM MAIL   Вверх
Gold Dragon
Дата 18.7.2012, 21:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Призрачный
****


Профиль
Группа: Экс. модератор
Сообщений: 6753
Регистрация: 1.3.2004
Где: Россия, Тамбов

Репутация: 10
Всего: 71



Что-то не предусмотрели подобный вариант разработчики PHP, а то что предусмотрели, работает на удивление очень медленно


--------------------
Нельзя жить в прошлом, оно уже прошло.
Нельзя жить в будущем, оно ещё не наступило.
Нужно жить в настоящем, помня прошлое и думая о будущем!
PM MAIL WWW ICQ   Вверх
baldina
Дата 19.7.2012, 09:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3433
Регистрация: 5.12.2007
Где: Москва

Репутация: 26
Всего: 101



массивы php - хеш таблицы, это единственный вид контейнера (который может притворяться и массивом и списком) отсюда все плюсы и минусы. так что имеет смысл посмотреть в сторону spl, где нативно реализованы некоторые основные структуры данных. с 5.3 spl - неотъемлемая часть php, поэтому можно считать, что array() не единственная структура.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "PHP"
Aliance
IZ@TOP
skyboy
SamDark
MoLeX

Новичкам:

  • PHP редакторы собираются и обсуждаются здесь
  • Электронные книги по PHP, документацию можно найти здесь
  • Интерпретатор PHP, полную документацию можно скачать на PHP.NET

Важно:

  • Не брезгуйте пользоваться тегами [code=php]КОД[/code] для повышения читабельности текста/кода.
  • Перед созданием новой темы воспользуйтесь поиском и загляните в FAQ
  • Действия модераторов можно обсудить здесь

Внимание:

  • Темы "ищу скрипт", "подскажите скрипт" и т.п. будут переноситься в форум "Web-технологии"
  • Темы с именами: "Срочно", "помогите", "не знаю как делать" будут УДАЛЯТЬСЯ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, IZ@TOP, skyboy, SamDark, MoLeX, awers.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | PHP: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0575 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.