Страницы

Поиск по вопросам

воскресенье, 12 мая 2019 г.

правильная сортировка массива по значению

есть массив
[0] => Array ( [title] => ITEM1 [id] => 1 [voites] => 0 )
[1] => Array ( [title] => ITEM2 [id] => 2 [voites] => 0 )
[2] => Array ( [title] => ITEM3 [id] => 3 [voites] => 4 // высший рейтинг ) [3] => Array ( [title] => ITEM4 [id] => 4 [voites] => 0 )
нужно отсортировать по полю voites... и нужно, чтобы не нарушался порядок.. например, обычная отсортировка выводит сначала элемент с наибольшим значение в voites(что и логично), но остальные, у которых это поле равно 0, выводит с конца... сортирую через usort()... не получается написать к нему cmp функцию
public function srtCMP($a, $b){ return $b["voites"] - $a["voites"]; }
повторюсь: нужно, чтобы не нарушался порядок... элементы у которых высший рейтинг должны подниматься вверх, а остальные оставить как есть
вот так:
[0] => Array ( [title] => ITEM3 [id] => 3 [voites] => 4 // высший рейтинг ) [1] => Array ( [title] => ITEM1 [id] => 1 [voites] => 0 )
[2] => Array ( [title] => ITEM2 [id] => 2 [voites] => 0 ) [3] => Array ( [title] => ITEM4 [id] => 4 [voites] => 0 )


Ответ

По сути, имеется две сортировки: по убыванию voites и (при их равенстве) - по возрастанию ключа элемента. Для применения функции usort() надо временно запомнить этот ключ внутри элемента. Например, так:
$common = Array( "0" => Array ( "title" => ITEM1, "id" => 1, "voites" => 0 ),
"1" => Array ( "title" => ITEM2, "id" => 2, "voites" => 0 ),
"2" => Array ( "title" => ITEM3, "id" => 3, "voites" => 4 // высший рейтинг ), "3" => Array ( "title" => ITEM4, "id" => 4, "voites" => 0 ) );
function cmp($a, $b) { if ($a["voites"] == $b["voites"]) { if (end($a) == end($b)) { return 0; } return (end($a) < end($b)) ? -1 : 1; } return ($a > $b) ? -1 : 1; }
function add_key(&$item, $key){ array_push($item,$key); }
function delete_key(&$item, $key){ array_pop($item); }
array_walk($common, 'add_key'); usort($common, 'cmp'); array_walk($common, 'delete_key'); var_dump($common);
Результат:
array (size=4) 0 => array (size=3) 'title' => string 'ITEM3' (length=5) 'id' => int 3 'voites' => int 4 1 => array (size=3) 'title' => string 'ITEM1' (length=5) 'id' => int 1 'voites' => int 0 2 => array (size=3) 'title' => string 'ITEM2' (length=5) 'id' => int 2 'voites' => int 0 3 => array (size=3) 'title' => string 'ITEM4' (length=5) 'id' => int 4 'voites' => int 0

пятница, 10 мая 2019 г.

Как прописать редирект в .htaccess если изменился домен?

Есть старый сайт на поддомене, например 2015.site.ru
поменяли основной домен site.ru на 2015.site.moscow
теперь нужно чтобы все обращения к 2015.site.ru переадресовывались на 2015.site.moscow
И естественно, не только обращения только к инденсу домена, но и любые другие, например чтобы http://2015.site.ru/images/pic.gif преобразовывался в http://2015.site.moscow/images/pic.gif
Однако при обращение к основному сайту site.ru не должно быть переадресации на site.moscow Подскажите пожалуйста, как такое прописать в .htaccess?


Ответ

просто классика. скопировано из ответа
rewriteengine on rewritecond %{HTTP_HOST} ^a\.example\.com rewriterule ^(.*)$ http://b.example.com/$1 [r,l]

доп. информация: http://wiki.apache.org/httpd/WhenNotToUseRewrite

Как не менять строку после выполнения команды bash

Делаю вывод любой команды bash в файл, после этого делаю вывод следующей команды в этот же файл. Хочу чтобы результат второго вывода записывался в ту же строку, что и первый.
Например: echo 123 > file date >> file
чтобы в итоге получилось 123 Вт. дек. 8 14:17:39 MSK 2015
Вывод будет вестись в большом массиве текста, поэтому решение не должно быть универсальным для любой строки в документе.


Ответ

man echo
echo -n "123 " > file echo -n `date` >> file

Набор номера мобильного телефона с Android приложения

Есть активити в котором в ListView отображаются заказы, в каждом заказе есть поле: номер телефона, как можно прямо в ListView сделать этот номер ссылкой, при нажатии на которую - набирался бы номер?


Ответ

1)Прописываем в манифесте:
2)Код для звонка
Intent intent = new Intent(Intent.ACTION_CALL, Uri.parse("tel:" + yourArrayList.getPosition(position).getPhoneNumber())); startActivity(intent);
3) Выше пример для списка с объектами. Если же у вас каждый элемент это одно текстовое поле со всей инфой, то надо бы передеалть тогда. Ну или как максимум поиграться с subString

Как получить полный путь к папкам Temp и Application Data

Имеются ввиду системная папка Temp в WINDOWS\ и Application Data (%APPDATA%)


Ответ

%APPDATA% можно получить, например, функцией SHGetFolderPath или getenv из стандартной библиотеки, %TEMP% для текущего пользователя - GetTempPath или та же getenv, а вот для получения системной папки %TEMP% придётся использовать функцию ExpandEnvironmentStringsForUser
#include
#include #include #include
int main() { TCHAR szPath[MAX_PATH]; char* path;
if(SUCCEEDED(SHGetFolderPath(NULL, CSIDL_APPDATA, NULL, 0, szPath))) { std::cout << "%APPDATA% (SHGetFolderPath) = " << szPath << std::endl; }
path = getenv("APPDATA"); if (path != NULL) { std::cout << "%APPDATA% (getenv) = " << path << std::endl; }
if (GetTempPath(MAX_PATH, szPath)) { std::cout << "User's %TEMP% (GetTempPath) = " << szPath << std::endl; }
path = getenv("TEMP"); if (path != NULL) { std::cout << "User's %TEMP% (getenv) = " << path << std::endl; }
if (ExpandEnvironmentStringsForUser(NULL, "%TEMP%", szPath, MAX_PATH)) { std::cout << "System's %TEMP% = " << szPath << std::endl; }
return 0; }
Для использования ExpandEnvironmentStringsForUser нужно дополнительно прилинковаться к Userenv.dll

Ревью Архитектуры приложения

Есть решение разбитое на следующие слои: DAO, DAL, Services Gui где,
DAO - здесь хранятся классы описывающие доменнные модели; DAL - Generic Repository и его реализация; Services - здесь у меня методы по типу следующего: IEnumerable GetEntities() Gui - клиентская часть
предвижу сразу вопрос чем Services отличается от Repository, в репозитории у меня базовые методы CRUD
void Create(Entity entity); void Update(Entity entity); void Delete(Entity entity); IQueryable Table {get;}
в Services же у меня строются более сложные запросы: соединения, группировка например:
var _orders = получаем данные; var _histories = получаем данные; var orders = _orders.Join(_histories, o=>o.Id, h=>h.OrderId,(o,h)=>new OrderView { //Формируем необходимое представление }) .ToList();
ну и т.п.
зависимости между проектами следующие:
DAO подключен в качестве reference в DAL, Services, Gui DAL подключен в качестве reference в Services, Gui Services подключен в качестве reference в Gui
Хочу проект сделать так что бы дальнейшая поддержка причиняла как можно меньше проблем.
Правильно ли я поступил разбив проект на более мелкие части, или я сделал так зря и необходимо слить все в один проект а разделение сделать на уровне директорий внутри решения и namespace
Буду премного благодарен за ссылки на литературу которую стоит почитать что бы прояснить для себя как правильно строить каркас приложения


Ответ

Есть самые разные способы проектирования приложения. Как я вижу вы пытаетесь использовать DDD. Этот паттрен достаточно универсален, но не является сильвербуллетом, а так же имеет очень много вариаций реализации, например CQRS+ES или DDD+Onion которые имеют свои назначения, а вместе с ним свои плюсы и минусы.
По мимо DDD и его вариаций, существуют такие архитектурные паттерны как EDA, SOA, NLayer и другие.
Что бы поддержка не причиняла больших проблем, нужно сначала выбрать правильную архитектуру, а это вопрос не только правильного выбора паттерна, но языка, стека технологий и многого другого. Сам же выбор зависит от решаемой задачи и различных условий.

PHP: Вставить пробел каждые N символов но начиная с конца

Как вставить пробел на РНР каждые N символов но начиная отсчет не с начала строки а с конца. Например чтобы с 1234567 получить 1 234 567 (если каждые три символа). chunk_split и wordwrap работают лишь со значениями больше 0
Можно в принципе вот так:
$reverse = strrev("1234567"); $withSpaces = chunk_split($reverse, 3, ' '); echo strrev($withSpaces);
Но может есть что то проще


Ответ

number_format
Если вкратце:
Вводимое число Сколько символов после "точки" Разделитель "точки" Разделитель тысячных (каждый третий с конца)
Пример:
echo number_format(1000000, 0, '.', ' '); // 1 000 000
echo number_format(1000000, 2, '.', ','); // 1,000,000.00