对嵌套数组元素的修改不会粘连

时间:2016-02-05 17:01:54

标签: php

我要么正在解决疲劳障碍,要么我对PHP的理解存在严重差距。这是我需要做的事情

  • 我有一个数组( A )数组( a
  • 我需要遍历外部数组和
  • 对于每个内部数组,我需要添加一个新元素,而后者又是一个数组
  • 这是我每天多次制作的代码,我原本以为没什么问题。然而,令我惊讶的是,虽然我可以修改 a 但我无法使这些修改成为现实并出现在 A

这是代码

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

}

这里肯定有一些令人眼花缭乱的明显错误但我无法弄明白。我希望有人能够发现这个问题。

4 个答案:

答案 0 :(得分: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 :(得分: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;
}   

答案 2 :(得分:0)

这是我最终做的事情

fileB=open('AtoG_mock.txt').readlines()
fileA=open('depth_ice.txt').readlines()
outfile=open('AtoG_depth_ice.txt','w')
dict1={}

for line in fileA:
    a=line.strip().split('\t')
    site = a[0]+' '+a[1]
    if site not in dict1:
        dict1[site]=a[2]

for line in fileB:
    b=line.strip().split('\t')
    site=b[0]+' '+b[1]
    if site in dict1:
        outfile.write(b[0]+'\t'+b[1]+'\t'+dict1[site]+'\n')

outfile.close()

这简单地避免了创建嵌套数组元素的本地副本,从而避免了这个问题。

答案 3 :(得分:-1)

最后一行不应该是trigger_error(json_encode($ route));