Te voy a compartir mi función, pero solo para que te hagas una idea de cómo debe de ser, mi script hace muchas más cosas a parte de buscar una posición vacía así que no te aferres a esta funcíón porque no te servirá aunque sí tendrás una visión más exacta de cómo debes de desarrollar la tuya.
Código PHP:
private function getStructure($member) {
if(!in_array($member['Matrix'], $this->refersIn)) {
$this->refersIn[] = $member['Matrix'];
if($member['Active'] == 1)
$this->activeMembers['Active']++;
else
$this->activeMembers['Inactive']++;
# Buscamos referidos directos
$referrers = $this->getReferrers($member['id']);
if(!is_null($referrers)) {
$this->referring = true;
$this->setHtml($this->openList());
foreach ($referrers as $ref) {
$this->setHtml($this->addMemberTo($ref));
# Buscamos referidos indirectos (siguiente nivel)
$refs = $this->getStructure($ref);
}
$this->setHtml($this->closeList());
$this->referring = false;
}
unset($this->array[$member['Matrix']]);
}
}
A partir de aquí deberías de encontar ya tu solución definitiva pues de esta manera, yo puedo llegar al maximo de niveles de profundidad que pudiese soportar php