我要么正在解决疲劳障碍,要么我对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
}
这里肯定有一些令人眼花缭乱的明显错误但我无法弄明白。我希望有人能够发现这个问题。
答案 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));