Учитывая, что у меня есть массив:
$array = array(
'a' => array(
'b' => array(
'c' => 'hello',
),
),
'd' => array(
'e' => array(
'f' => 'world',
),
),
);
Я хочу "сгладить" его для поиска ссылок в одном измерении, объединяя ключи с разделителем ( в случае этого примера, прямая косая черта /
)
Выполнение var_dump()
при успешном выводе даст: ( обратите внимание на все ссылки )
array(6) {
["a"]=>
&array(1) {
["b"]=>
&array(1) {
["c"]=>
&string(5) "hello"
}
}
["a/b"]=>
&array(1) {
["c"]=>
&string(5) "hello"
}
["a/b/c"]=>
&string(5) "hello"
["d"]=>
&array(1) {
["e"]=>
&array(1) {
["f"]=>
&string(5) "world"
}
}
["d/e"]=>
&array(1) {
["f"]=>
&string(5) "world"
}
["d/e/f"]=>
&string(5) "world"
}
array(2) {
["a"]=>
&array(1) {
["b"]=>
&array(1) {
["c"]=>
&string(5) "hello"
}
}
["d"]=>
&array(1) {
["e"]=>
&array(1) {
["f"]=>
&string(5) "world"
}
}
}
В его нынешнем виде я использую это:
function build_lookup(&$array, $keys = array()){
$lookup = array();
foreach($array as $key => &$value){
$path = array_merge($keys, (Array) $key);
$lookup[implode('/', $path)] = &$value;
if(is_array($value)){
$lookup = array_merge($lookup, build_lookup($value, $path));
}
}
return $lookup;
}
Однако я пытаюсь улучшить его, удалив элемент рекурсии ( переключение на подход стек / поп )Проблема с этим заключается в сохранении ссылок, так как типичный подход рекурсии к нерекурсии:
$stack = $input;
while(!empty($stack)){
$current = array_pop($stack);
// do stuff and push to stack;
}
... терпит неудачу со ссылками.
Я видел несколькопохожие вопросы / ответы по SO, хотя ни один из них не касался должным образом ссылок (, поскольку это не было намерением автора вопроса )
Есть ли лучшее ( читать быстрее ) подходить сюда?
Возможное решение ( спасибо @ chris ):
/**
*
* @return array
*/
public function get_lookup_array()
{
$stack = $lookup = array();
try
{
foreach($this->_array as $key => &$value)
{
$stack[$key] = &$value;
}
while(!empty($stack))
{
$path = key($stack);
$lookup[$path] = &$stack[$path];
if(is_array($lookup[$path]))
{
foreach($lookup[$path] as $key => &$value)
{
$stack[$path . $this->_separator . $key] = &$value;
}
}
unset($stack[$path]);
}
}
catch(\Exception $exception)
{
return false;
}
return $lookup;
}