[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Рекурсия
Slays
Есть массив, где значения также являются ключами:


$data = array(
'a' => array('x', 'c', 'd'),
'b' => array('n', 'r'),
'e' => array('z', 'x'),
'x' => array('r', 'e')
);


Надо объединить массивы, если значение есть в предыдущем, например, вот у нас в первом есть значения array('x', 'c', 'd'), значит надо объединить массив 'a' с этими массивами и массивами, ключи которых есть в них, т.е. рекурсивно.

На выходе должно получиться что-то типо:


$res = array(
'a' => array('x', 'c', 'd', 'r', 'e', 'z'),
'b' => array('n', 'r')
);


Рекурсии как-то слабовато даются, вот где застопорился.


$res = [];
foreach($data as $name => $row){
$res[$name] = getRec($row);
}
print_r($res);

function getRec($row){
$answ = [];
foreach($row as $q){
if(!isset($data[$q])) continue;

// тут нужна рекурсия, наверно, так не работает
$answ = array_merge($answ, getRec($data[$q]));

// чтобы убрать уже просмотренные массивы
unset($data[$q]);
}
return $answ;
}


_____________
если помог, не скупись на карму =)
walerus
Slays Бесконечная рекурсия получается...

Цитата
На выходе должно получиться что-то типо:
неправильное "типо"

Пример:
$data = array(
'a' => array('x', 'c', 'd'),
'b' => array('n', 'r'),
'e' => array('z', 'x'),
'x' => array('r', 'e')
);


Ключ А содержит X C D,
Ключ X содержит R E,
Ключ R - у нас НЕТ,
Ключ E - содержит Z X,
Ключ Z - у нас НЕТ,
Ключ X - содержит R E
...
и так по кругу... потому как ключи X и E, содержат "друг друга", либо условие нужно как то изменить/дополнить, либо ... бесконечность.
Slays
Нет, рекурсия не бесконечная, потому что при использовании значение массива убирается unset($data[$q]); и повторно к нему уже не обратиться if(!isset($data[$q])) continue;

_____________
если помог, не скупись на карму =)
sergeiss
Slays, держи.

Если тебе нужен рабочий код, то вот он. Если тебе нужна именно рекурсия, то разбирайся дальше сам.

Рабочий на 146% код
$data = array(
'a' => array('x', 'c', 'd'),
'b' => array('n', 'r'),
'e' => array('z', 'x'),
'x' => array('r', 'e')
);


/*
$res = array(
'a' => array('x', 'c', 'd', 'r', 'e', 'z'),
'b' => array('n', 'r')
);
*/


$keys = array_keys($data);
$loops = count($keys) - 1;

for ($i = 0; $i < $loops; $i++):
$key_last = $keys[count($keys)-1];
$used = false;

foreach ($data as $key => $val) {
if (in_array($key_last, $val)) {
$data[$key] = array_unique(array_merge($data[$key], $data[$key_last]));
$used = true;
}
}


if ($key == $key_last) {
if ($used) {
unset($data[$key_last]);
unset($keys[count($keys)-1]);
}
$used = false;
}

endfor;

echo "final:<pre>".print_r($data, 1).'</pre>';


У меня выдает такой результат:

Результат:
final:
Array
(
[a] => Array
(
[0] => x
[1] => c
[2] => d
[3] => r
[4] => e
[5] => z
)

[b] => Array
(
[0] => n
[1] => r
)

)


ПыСы. Эх, давно шашку в руках не держал :) Всё на JS и на JS работаю.

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

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

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

user posted image
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.