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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> сортировка по значениям массива 
V
    Опции темы
alligator
Дата 31.7.2014, 16:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 730
Регистрация: 28.1.2004

Репутация: нет
Всего: 1



Всем доброго времени суток, имеется массив вот с такими данными, для примера привожу один из элементов
Код

SimpleXMLElement Object
(
    [@attributes] => Array
        (
            [Title] => Информация  о  процентных  ставках по договорам банковского  вклада с физическими лицами
            [DocDate] => 06.2014
            [ver] => 1.0
        )

    [Org] => SimpleXMLElement Object
        (
            [@attributes] => Array
                (
                    [RegNum] => 3286
                    [Name] => ООО "Дагэнергобанк"
                )

            [DepositsRub] => SimpleXMLElement Object
                (
                    [@attributes] => Array
                        (
                            [Title] => По срокам согласно заключенным договорам банковского вклада с физическими лицами в российских рублях (в процентах годовых)
                        )

                    [CallDep] => 1,450
                    [Dep90] => -
                    [Dep91-180] => 7,339
                    [Dep181-1] => 12,197
                    [Dep1-3] => 12,815
                    [Dep3up] => 13,603
                )

            [DepositsUSD] => SimpleXMLElement Object
                (
                    [@attributes] => Array
                        (
                            [Title] => По срокам согласно заключенным договорам банковского вклада с физическими лицами в долларах США (в процентах годовых)
                        )

                    [CallDep] => -
                    [Dep90] => -
                    [Dep91-180] => -
                    [Dep181-1] => 5,000
                    [Dep1-3] => 4,151
                    [Dep3up] => -
                )

            [DepositsEur] => SimpleXMLElement Object
                (
                    [@attributes] => Array
                        (
                            [Title] => По срокам согласно заключенным договорам банковского вклада с физическими лицами в евро (в процентах годовых)
                        )

                    [CallDep] => -
                    [Dep90] => -
                    [Dep91-180] => -
                    [Dep181-1] => 5,000
                    [Dep1-3] => -
                    [Dep3up] => -
                )

        )

)


Таких элементов в массиве может быть сколько угодно.
Мне необходимо отсортировать массив с такими элементами по следующим критериям:
найти среди банков по каждой валюте наивысшую ставку и отсортировать массив по убыванию.

какой алгоритм действий по решению данного вопроса? с чего начать?
                  

Это сообщение отредактировал(а) alligator - 31.7.2014, 16:25
PM MAIL   Вверх
Aliance
Дата 1.8.2014, 08:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


I ♥ <script>
****


Профиль
Группа: Модератор
Сообщений: 6418
Регистрация: 2.8.2004
Где: spb

Репутация: 2
Всего: 137



Такая сортировка реализуется через usort. Если что-то не понятно из примеров в документации, сделайте var_dump аргументов внутри callback и станет яснее. Если вопрос останется открытым - уточняйте, что не ясно.
PM MAIL WWW ICQ Skype   Вверх
alligator
Дата 1.8.2014, 10:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 730
Регистрация: 28.1.2004

Репутация: нет
Всего: 1



Цитата(Aliance @ 1.8.2014,  09:19)
Такая сортировка реализуется через usort. Если что-то не понятно из примеров в документации, сделайте var_dump аргументов внутри callback и станет яснее. Если вопрос останется открытым - уточняйте, что не ясно.

сделал так для ставки 181 день до 1 года:

Код

function cmp($a, $b)
{   
    //var_dump($a);
    //var_dump($b);
$deposit91='Dep91-180'; $deposit181='Dep181-1'; $deposit1='Dep1-3';
 
$aa = preg_replace("/[,.]+/is", "", $a->Org->DepositsRub->$deposit181);
$bb = preg_replace("/[,.]+/is", "", $b->Org->DepositsRub->$deposit181);
    if ($aa == $bb) { return 0; }  return ($aa > $bb) ? -1 : 1;
}



Получается мне для сортировки по остальным ставкам и валютам нужно в этой функции прописать такой же код только для других ставок и т.д.

или несколько раз вызывать usort.

может циклом пройти массив ?
как лучше?
PM MAIL   Вверх
baldina
Дата 1.8.2014, 11:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



допустим банк А имеет ставку XA по валюте X и YA по валюте Y, а банк В соответственно ставки XB и YB.
положим XA < XB и YA > YB. в каком порядке должны идти банки?
либо вы делаете несколько различных списков, каждый из которых отсортирован по своему критерию, либо вам нужно упорядочить критерии, и делать сортировку по первому, второму и т.д.
в этом случае будет что-то типа
Код

function cmp($a, $b)
{   
   $curr = array ('DepositsRub', 'DepositsEur', 'DepositsUSD');
   $dep = array ('Dep91-180', 'Dep181-1', 'Dep1-3');
   foreach ($curr as $c)
     foreach ($dep as $d) {
        $a_value = floatval(str_replace(',', '.', $a->Org->$c->$d));
        $b_value = floatval(str_replace(',', '.', $b->Org->$c->$d));
        if ($a_value !== $b_value)
           return ($a_value  < $b_value) ? -1 : 1;
   }
   return 0;
}


Это сообщение отредактировал(а) baldina - 1.8.2014, 11:21
PM MAIL   Вверх
alligator
Дата 1.8.2014, 12:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 730
Регистрация: 28.1.2004

Репутация: нет
Всего: 1



Цитата(baldina @ 1.8.2014,  12:20)
допустим банк А имеет ставку XA по валюте X и YA по валюте Y, а банк В соответственно ставки XB и YB.
положим XA < XB и YA > YB. в каком порядке должны идти банки?
либо вы делаете несколько различных списков, каждый из которых отсортирован по своему критерию, либо вам нужно упорядочить критерии, и делать сортировку по первому, второму и т.д.
в этом случае будет что-то типа
Код

function cmp($a, $b)
{   
   $curr = array ('DepositsRub', 'DepositsEur', 'DepositsUSD');
   $dep = array ('Dep91-180', 'Dep181-1', 'Dep1-3');
   foreach ($curr as $c)
     foreach ($dep as $d) {
        $a_value = floatval(str_replace(',', '.', $a->Org->$c->$d));
        $b_value = floatval(str_replace(',', '.', $b->Org->$c->$d));
        if ($a_value !== $b_value)
           return ($a_value  < $b_value) ? -1 : 1;
   }
   return 0;
}

Банки сортирую по ставкам от большего в меньшему
PM MAIL   Вверх
baldina
Дата 1.8.2014, 13:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



у вас разные виды ставок. вы сравниваете доллары с рублями и депозиты на разные сроки?

Добавлено через 1 минуту и 25 секунд
вы же сами об этом пишете
Цитата(alligator @  1.8.2014,  10:36 Найти цитируемый пост)
Получается мне для сортировки по остальным ставкам и валютам нужно в этой функции прописать такой же код только для других ставок

у вас либо несколько видов сортировки, и тогда поле по которому сортируется - параметр сортировки.
либо сортировка одна, и вам нужно задать приоритет полей.

Добавлено через 3 минуты и 30 секунд
Цитата(alligator @  1.8.2014,  12:05 Найти цитируемый пост)
Банки сортирую по ставкам от большего в меньшему

относительно моего примера: первым будет банк А или B? или зависит от вида сортировки (по X или Y)? или вы будете сравнивать XA, XB, YA, YB между собой?
PM MAIL   Вверх
alligator
Дата 1.8.2014, 14:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 730
Регистрация: 28.1.2004

Репутация: нет
Всего: 1



Цитата(baldina @  1.8.2014,  14:13 Найти цитируемый пост)
либо сортировка одна, и вам нужно задать приоритет полей.

Хотелось бы понять как это сделать?
Задача из общего списка банков выделить банки с максимальными ставками по той или определенной валюте и ставке......
подумаю как лучше сделать... отпишусь чуть позднее

Добавлено @ 14:30
Цитата(baldina @  1.8.2014,  14:13 Найти цитируемый пост)
у вас разные виды ставок. вы сравниваете доллары с рублями и депозиты на разные сроки?

Сравнивать буду рубли с рублями а доллары с долларами учитывая определенный тип депозита.

Цитата(baldina @  1.8.2014,  14:13 Найти цитируемый пост)
относительно моего примера: первым будет банк А или B? или зависит от вида сортировки (по X или Y)? или вы будете сравнивать XA, XB, YA, YB между собой? 

Предварительно планирую сделать так: сравнивать XA, XB, YA, YB между собой

Это сообщение отредактировал(а) alligator - 1.8.2014, 14:31
PM MAIL   Вверх
baldina
Дата 1.8.2014, 14:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(alligator @  1.8.2014,  14:24 Найти цитируемый пост)
Хотелось бы понять как это сделать?

см. мой код выше - последовательность в циклах и устанавливает приоритет

Цитата(alligator @  1.8.2014,  14:24 Найти цитируемый пост)
Сравнивать буду рубли с рублями а доллары с долларами учитывая определенный тип депозита.

Цитата(alligator @  1.8.2014,  14:24 Найти цитируемый пост)
Предварительно планирую сделать так: сравнивать XA, XB, YA, YB между собой

противоречие однако


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


Опытный
**


Профиль
Группа: Участник
Сообщений: 730
Регистрация: 28.1.2004

Репутация: нет
Всего: 1



Цитата(baldina @  1.8.2014,  15:37 Найти цитируемый пост)
противоречие однако

ой, точно ошибся.. XA c XB, XC и тд....
PM MAIL   Вверх
baldina
Дата 1.8.2014, 15:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



alligatorтакого хотите, или нет?
PM MAIL   Вверх
alligator
Дата 12.8.2014, 08:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 730
Регистрация: 28.1.2004

Репутация: нет
Всего: 1



Цитата(baldina @ 1.8.2014,  16:20)
alligatorтакого хотите, или нет?
Код

<?php
 
$deposits = [
  'СБ' =>['RUR'=>['90'=>7.0, '180'=>9.1], 'USD'=>['90'=>3.2, '180' => 5.2]],
  'ВТБ'=>['RUR'=>['90'=>7.2, '180'=>9.2], 'USD'=>['90'=>3.1, '180' => 5.0]],
  'МКБ'=>['RUR'=>['90'=>7.1, '180'=>9.3], 'USD'=>['90'=>3.3, '180' => 5.1]],
];
 
function compareBy ($currency, $term) {
  return function ($bank1, $bank2) use ($currency, $term) {
     $value1 = $bank1[$currency][$term];
     $value2 = $bank2[$currency][$term];
     if ($value1 == $value2)
       return 0;
     else
       return $value1 < $value2 ? -1 : 1;
  };
}
 
function printArray ($array, $inline=false) {
  $i=0;
  foreach ($array as $key=>$value) {
    if ($inline && $i++) echo ',';
    echo "$key=>";
    if (is_array ($value)) { echo '['; printArray ($value, true); echo ']'; }
    else echo $value;
    if (!$inline) echo PHP_EOL;
  }
  if (!$inline) echo PHP_EOL;
}
 
uasort ($deposits, compareBy ('RUR',  '90')); printArray($deposits);
uasort ($deposits, compareBy ('USD', '180')); printArray($deposits);


Да именно так уже сделал, спасибо большое!!!

Единственное прошу попдробней рассказать про 
Код

return function ($bank1, $bank2) use ($currency, $term) 


Это сообщение отредактировал(а) alligator - 23.6.2016, 16:15
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | PHP: Тексты | Следующая тема »


 




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


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

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