- Поисковые системы
- Практика оптимизации
- Трафик для сайтов
- Монетизация сайтов
- Сайтостроение
- Социальный Маркетинг
- Общение профессионалов
- Биржа и продажа
- Финансовые объявления
- Работа на постоянной основе
- Сайты - покупка, продажа
- Соцсети: страницы, группы, приложения
- Сайты без доменов
- Трафик, тизерная и баннерная реклама
- Продажа, оценка, регистрация доменов
- Ссылки - обмен, покупка, продажа
- Программы и скрипты
- Размещение статей
- Инфопродукты
- Прочие цифровые товары
- Работа и услуги для вебмастера
- Оптимизация, продвижение и аудит
- Ведение рекламных кампаний
- Услуги в области SMM
- Программирование
- Администрирование серверов и сайтов
- Прокси, ВПН, анонимайзеры, IP
- Платное обучение, вебинары
- Регистрация в каталогах
- Копирайтинг, переводы
- Дизайн
- Usability: консультации и аудит
- Изготовление сайтов
- Наполнение сайтов
- Прочие услуги
- Не про работу
Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий
Доброго вам, коллеги!
Если кому надоели простые вопросы, вот посложней :)
Есть массив данных
a,b,c
a,bb,cc
aa,bb,ccc
aa,bb,cccc
и т.д., произвольного размера
Нужно на выходе получить массив тех же данных но с древовидной структурой, где одно из значений становится значением, а остальные ключами в новом массиве.
Требуемый порядок - динамический, с произвольным количеством значений(последний элемент станет значением, остальные ключами):
0,1,2
Эталонным результатом примера служит массив:
Мне удалось решить для ограниченного количества ключей, а вот как сделать универсальный код для неограниченных размеров массивов?
Я плохо понял задачу, но по моему на рекурсии это очень просто сделать. :)
siv1987, я тоже так думал, причем несколько часов. Это если в обратную сторону данные перегнать - да, легкая рекурсия.
Проблема сводится к тому, что требуется из одномерного
a,b,c,d,e
создать
[a][c][d]=e
но я не соображу как динамически добавить ключ, если входящие будут не
a,b,c,d,e
а
a,b,c,d,e,f ?
aa,bb,cccc
[aa][bb] одновременно и ccc, и cccc быть не может?
Задача некорректно поставлена..
a,b,c,d,e => abcd = 'e'
a,b,c,d,e,f => abcd = array('e'=>'f')
Одно другое перепишет.
ivan-lev, спасибо, вроде понял, попробую закодить.
[aa][bb] это массив, в котором
0 => ccc
1 => cccc
[aa][bb] это массив, в котором
0 => ccc
Добавьте к результату ещё одну строчку:
и ещё одну
Приводить в порядок лень, накидал по-быстрому:
<?
$aData = array(
array('a', 'b', 'c'),
array('a', 'bb', 'cc'),
array('aa', 'bb', 'ccc'),
array('aa', 'bb', 'cccc')
); //массив данных
$aDataOut = array();
foreach ($aData as $arr) {
$aDataOut = array_merge_recursive($aDataOut,rec($arr));
}
print_r($aDataOut);
function rec(&$data, $key = null) {
$data_out = array();
$data_keys = array_keys($data);
if ($key) {
if (isset($data[$key + 1]))
$data_out[$data[$key]] = rec($data, $key + 1);
else
$data_out = $data[$key];
return $data_out;
}else{
$data_out[$data[$data_keys[0]]] = rec($data, $key + 1);
}
return $data_out;
}
mozart007, спасибо огромное, работает на ура, но проходит по порядку.
Не подскажите, как к ней можно прикрутить $varorder=array(0,1,2); ?
это порядок и перечень ключей для $data, мне ведь нужно не все а выборочно в соответствии с этим массивом. Который может быть и $varorder=array(2,0); например... не могу сообразить :(
mozart007, спасибо огромное, работает на ура, но проходит по порядку.
Не подскажите, как к ней можно прикрутить $varorder=array(0,1,2); ?
это порядок и перечень ключей для $data, мне ведь нужно не все а выборочно в соответствии с этим массивом. Который может быть и $varorder=array(2,0); например... не могу сообразить :(
Уточните вопрос максимально подробно, сейчас я это читаю как белиберду ☝
mozart007, извиняюсь, в мыслях уже полный сумбур. Постараюсь подробно: ваш код вносит в массив все значения, которые есть в $aDATA(массив двумерный).
Мне же необходимо, чтобы с той же логикой вносились только значения вложенных массивов, ключи которых перечислены в $varorder, причем в порядке, в котором они там перечислены. Ваш вариант работает так, как будто $varorder=array(0,1,2.....);
т.е.
значение $aDATA[0][2] попадает в $aDataOut[$aDATA[0][0]][$aDATA[0][1]][]
значение $aDATA[1][2] попадает в $aDataOut[$aDATA[1][0]][$aDATA[1][1]][]
значение $aDATA[2][2] попадает в $aDataOut[$aDATA[2][0]][$aDATA[2][1]][] и т.д.
требуется сделать так, чтобы
при $varorder=array(2,0,1);
значение $aDATA[0][1] попадает в $aDataOut[$aDATA[0][2]][$aDATA[0][0]][]
значение $aDATA[1][1] попадает в $aDataOut[$aDATA[1][2]][$aDATA[1][0]][]
значение $aDATA[2][1] попадает в $aDataOut[$aDATA[2][2]][$aDATA[2][0]][] и т.д.
при $varorder=array(2,3); //в тестовых данных правда нет $aDATA[0][3] но будут :)
значение $aDATA[0][3] попадает в $aDataOut[$aDATA[0][2]][]
значение $aDATA[1][3] попадает в $aDataOut[$aDATA[1][2]][]
значение $aDATA[2][3] попадает в $aDataOut[$aDATA[2][2]][] и т.д.
$varorder может быть, например, array(2,3,5,0,16);
Эталонный результат при $varorder=array(0,1,2);
но если поменять $varorder=array(0,1,2); на $varorder=array(2,0,1); правильный результат будет таким:
$varorder=array(2,0); правильный результат
Читали про бритву Оккама?😂
Не плодиде сущностей, сначала ваши маасивы отсортируйте согласно нужной вам последовательности, а потом моим способом приводите к нужному массиву :)