У меня есть массив, который выглядит так:
Array ( [0] => Array ( [term_id] => 23 [name] => testasdf [depth] => 1 ) [1] => Array ( [term_id] => 26 [name] => asdf [depth] => 2 ) [2] => Array ( [term_id] => 31 [name] => Another level deep [depth] => 3 ) [3] => Array ( [term_id] => 32 [name] => Another level deep [depth] => 2 ) [4] => Array ( [term_id] => 24 [name] => testasdf [depth] => 1 ) [5] => Array ( [term_id] => 27 [name] => asdf [depth] => 1 ) )
Вот рекурсивная функция, которую я использую, она работает, за исключением некоторых случаев (где глубина больше.
function process(&$arr, &$prev_sub = null, $cur_depth = 1) { $cur_sub = array(); while($line = current($arr)){ if($line['depth'] < $cur_depth){ return $cur_sub; }elseif($line['depth'] > $cur_depth){ $prev_sub = $this->process($arr, $cur_sub, $cur_depth + 1 ); }else{ $cur_sub[$line['term_id']] = array('term_id' => $line['term_id'], 'name' => $line['name']); $prev_sub =& $cur_sub[$line['term_id']]; next($arr); } } return $cur_sub; }
Вот как выглядят результаты:
Array ( [23] => Array ( [26] => Array ( [31] => Array ( [term_id] => 31 [name] => Another level deep ) ) [32] => Array ( [term_id] => 32 [name] => Another level deep ) ) [24] => Array ( [term_id] => 24 [name] => testasdf ) [27] => Array ( [term_id] => 27 [name] => asdf ) )
Любая идея, как я могу иметь это, чтобы term_id и имя отображались для всех глубин?
попробуй это:
function process(&$arr, &$prev_sub = null, $cur_depth = 1) { $cur_sub = array(); while($line = current($arr)){ if($line['depth'] < $cur_depth){ return $cur_sub; } if($line['depth'] > $cur_depth){ $prev_sub = $this->process($arr, $cur_sub, $cur_depth + 1 ); } $cur_sub[$line['term_id']] = array('term_id' => $line['term_id'], 'name' => $line['name']); $prev_sub =& $cur_sub[$line['term_id']]; next($arr); } return $cur_sub; }