2016-02-05 51 views
0

我要麼通過疲勞障礙工作,要麼我對PHP的理解存在嚴重的空白。以下是我需要做對嵌套數組元素的修改不會停留

  • 我有數組的數組()(一個
  • 我需要通過爲每個所述內陣列的外部陣列和
  • 迭代我需要添加一個新元素,而這個元素又是一個數組
  • 這是我每天多次出現的代碼,並且我預料到它沒有什麼問題。然而,出乎我的意料,而我可以修改一個我不能讓這些修改棍子出現在一個

下面是代碼

function fillRouteNames($routes,$export) 
{ 
for($i=0;$i < count($routes);$i++) 
{ 
    $route = $routes[$i]; 
    trigger_error(gettype($route));//shows Array, as expected 
    $disps = $route['d']; 
    $nd = array(); 
    foreach($disps as $disp) $nd[] = fxnName($disp,$export); 
    //now I have the new element I want to add 
$route['nd'] = $nd; 
trigger_error(json_encode($route)); 
/as expected the output shows the new element, nd 
} 
trigger_error(json_encode($routes)); 
//but now it is gone - it is like I never did $oute['nd'] = $nd 

}

必須有這裏有一些非常明顯的錯誤,但我一直無法弄清楚。我希望這裏的某個人能夠發現這個問題。

回答

1

PHP數組按值分配,而不是引用。這意味着修改副本時,更改不會影響原件。 $route$routes[$i]是不同的陣列。

一種可能的解決辦法是複製$route回來了$routes[$i]你更新後:

for ($i = 0; $i < count($routes); $i ++) { 
    // Copy $routes[$i] into $routes for quick access and shorter code 
    $route = $routes[$i]; 

    // Update $route as needed 
    $route['nd'] = $nd; 
    // ... more updates ... 

    // Copy $route back over $routes[$i] 
    $routes[$i] = $route; 
} 
+0

謝謝!問題的完美總結!雖然我擔心它不能提供一個解決方案。 – DroidOS

+0

增加了一個可能的解決方案。還有其他的解決方案:使用[本答案](http://stackoverflow.com/a/35229858/4265352)中描述的引用(引用可以使代碼以更意想不到的方式破解),將'$ (更新與否)到一個新的數組(並在循環後放棄原始數組),使用對象而不是數組等。 – axiac

2

那是因爲$route是內部數組的一個副本。您需要添加參考或使用直接索引$routes[$i]。就像這樣:

function fillRouteNames($routes,$export) 
{ 
    for($i=0;$i < count($routes);$i++) 
    { 
     $route = &$routes[$i];// add a reference 

     trigger_error(gettype($route)); 

     $disps = $route['d']; 
     $nd = array(); 
     foreach($disps as $disp) $nd[] = fxnName($disp,$export); 

     $routes[$i]['nd'] = $nd;// OR use an index 

     trigger_error(json_encode($route)); 
    } 
    trigger_error(json_encode($routes)); 
} 
-1

不應該最後一行是trigger_error(json_encode($ route));

0

以下是我最後做

function fillRouteNames($routes,$export) 
{ 
for($i=0;$i < count($routes);$i++) 
{ 
    $disps = $routes[$i]['d']; 
    $nd = array(); 
    foreach($disps as $disp) $nd[] = fxnName($disp,$export); 
    $routes[$i]['nd'] = $nd; 
} 
return $routes; 
} 

這只是避免造成規避該問題的嵌套數組元素的本地副本。