2016-08-12 80 views
0

我想创建一个递归方法来填充每个找到的新项目的数组。递归方法填充数组php php laravel

function getUserUbigeoString($ubigeo_id){ 
    $ubigeoRepository = new \App\Repositories\UbigeoRepository(); 
    $ubigeos = array(); 

    $ubigeo = $ubigeoRepository->getUbigeo($ubigeo_id); 

    if(!empty($ubigeo)){ 
     if($ubigeo->ubigeo_id == null){ 
      $ubigeos[] = $ubigeo->name; 
     } 

     $ubigeos[] = getUserUbigeoString($ubigeo->ubigeo_id); 
    } 

    return $ubigeos; 
} 

该代码的目标是获得一个数组填充所有ubigeos的名称。

0 => ubigeo1 
1 => ubigeo2 
2 => ubigeo3 
etc... 

至于现在,我已经尝试将返回许多不同的位置,但我已经得到最接近的结果是:

array:1 [▼ 
    0 => array:1 [▼ 
    0 => array:2 [▼ 
     0 => "Port Dusty" 
     1 => [] 
    ] 
    ] 
] 

========== EDIT = ===========数据库ubigeos的 结构:

id name  level ubigeo_id 
---------------------------- 
3 ubigeo1 1  null 
37 ubigeo2 2  3 
55 ubigeo3 3  37 

输出将是一个简单的数组像这样,然后我可以内爆到逗号分隔的字符串:

array:1 [ 
    0 => 'ubigeo1' 
    1 => 'ubigeo2' 
    2 => 'ubigeo3' 
] 
+1

可以举个例子阵列和期望的输出。所以它可以更容易理解你想要做什么 –

+0

是的,我更新了答案的例子,它的值与一个简单的数组,所以我可以稍后使用implode得到一个逗号分隔的字符串,谢谢 – Carlos

+0

您能否请添加描述输入是如何构成的?即你是否只有一个Ubigeo实体链,其中每个Ubigeo可以有0或1个引用子Ubigeo(并且ubigeo.ubigeo_id定义了这个子实体)? – ejuhjav

回答

1

所以假设你真的想用带有Ubigeo实例的函数调用它,并且只从名称和父Ubigeo实例中获取名称(即,最初使用id 55调用函数来获得结果数组),你可以尝试这样的事情(我不想修改你的函数调用参数 - 通常我会包含数组作为函数参数,而不是在每个参数中实例化新的函数递归步骤):

function getUserUbigeoString($ubigeo_id) 
{ 
    $ubigeoRepository = new \App\Repositories\UbigeoRepository(); 
    $ubigeos = array(); 

    $ubigeo = $ubigeoRepository->getUbigeo($ubigeo_id); 

    if(!empty($ubigeo)) 
    { 
     if($ubigeo->ubigeo_id != null) { 
      $ubigeos = getUserUbigeoString($ubigeo->ubigeo_id); 
     } 
     $ubigeos[] = $ubigeo->name; 
    } 

    return $ubigeos; 
} 
+0

谢谢,正是我需要的。你是对的,最好将数组作为参数传递。 – Carlos

0

使用可与lists方法做到这一点在laravel

例:

$ubigeoRepository->lists('ubigeo_id','id')->all();