无法修改多维数组PHP

时间:2014-01-26 22:41:55

标签: php arrays multidimensional-array foreach

我有两个数组。 第一个($ dcel)看起来像这样:

Array(
[1] => Array
    (
        [V1] => 5
        [V2] => 2
        [F1] => 4
        [F2] => 1
        [P1] => 7
        [P2] => 4
    )
etc..

第二个($ PctOldNew)看起来像这样:

Array(
[0] => Array
    (
        [old] => 1
        [new] => 3
    )
etc..

我正试图找到这个老人的'第一个数组中的值(初始值)。这是我的代码:

foreach ($dcel as $latura) {
    for($i = 0; $i <= $nrPct; $i++){
        if($PctOldNew[$i]['old'] == $latura[V1]){
            $latura[V1] = $PctOldNew[$i]['new'];
        }
    }
}

如果我输出$ PctOldNew if if statment,输出它是正确的答案,但如果我尝试修改$ latura [V1],$ dcel保持不变。 我试过参考,钥匙......但没有任何作用,我也看不出有什么不对。

4 个答案:

答案 0 :(得分:0)

@CrayonViolent它没用,我试了很多次。 我现在正在使用代码进行播放,似乎这样就可以了:

foreach ($dcel as $key => $value) {

    foreach ($value as $val) {
        for($i = 0; $i <= $nrPct; $i++){
            if($PctOldNew[$i]['old'] == $value[V1])
                $new = $PctOldNew[$i]['new'];
        }
        $val = $new;
    }
    $dcel[$key][V1] = $val;
}

......但我不知道为什么。

答案 1 :(得分:0)

这有效:

编辑:将第二个数组元素添加到$ dcel以显示其工作原理

<?php
$dcel = Array(
'1' => Array
    (
        'V1' => 1, // <-- note that i changed this value from your original '5' to '1' so that your condition will actually match something, since this example data set doesn't actually have something to match
        'V2' => 2,
        'F1' => 4,
        'F2' => 1,
        'P1' => 7,
        'P2' => 4
    )
'2' => Array
    (
        'V1' => 5,
        'V2' => 2,
        'F1' => 4,
        'F2' => 1,
        'P1' => 7,
        'P2' => 4
    )

);
$PctOldNew = Array(
'0' => Array
    (
        'old' => 1,
        'new' => 3
    )
);

foreach ($dcel as &$latura) { // <-- reference on &$latura
    for($i = 0; $i <= $nrPct; $i++){
        if($PctOldNew[$i]['old'] == $latura['V1']){
            $latura['V1'] = $PctOldNew[$i]['new'];
        }
    }
}
echo "<pre>";print_r($dcel);

<强>输出

Array
(
    [1] => Array
        (
            [V1] => 3
            [V2] => 2
            [F1] => 4
            [F2] => 1
            [P1] => 7
            [P2] => 4
        )

    [2] => Array
        (
            [V1] => 5
            [V2] => 2
            [F1] => 4
            [F2] => 1
            [P1] => 7
            [P2] => 4
        )

)

答案 2 :(得分:0)

另一个奇怪的方法是使用array_walk

array_walk(&$dcel, function($latura){
  for($i = 0; $i <= $nrPct; $i++){
      if($PctOldNew[$i]['old'] == $latura[V1]){
          $latura[V1] = $PctOldNew[$i]['new'];
      }
  } 
});

array_map

$dcel = array_map(function($latura){
  for($i = 0; $i <= $nrPct; $i++){
      if($PctOldNew[$i]['old'] == $latura[V1]){
          $latura[V1] = $PctOldNew[$i]['new'];
      }
  } 
  return $latura;
}, $dcel);

(不确定为什么array_walkarray_map反转参数位置)

更新了真正的原因和2个可能的解决方案

您无法修改$latura的原因是因为您正在使用for...each循环,它将通过$latura按值而不是按引用传递。基于这个原因,您还有2个解决方案,

  • 使用for $dcel as $key => $latura,然后您可以更改$dcel[$key]
  • 使用for $dcel as &$latura,然后您可以直接更改项目

答案 3 :(得分:0)

在您的情况下,最方便的方法是使用array_map()函数 像这样:

$array = array(1,2,3,4,5);

$replacements = array(
    array('old'=>1, 'new'=>11),
    array('old'=>3, 'new'=>33),
);

$array = array_map(function($element){ 
    global $replacements;
    foreach($replacements as $r) if($r['old']==$element) return $r['new'];
    return $element;
}, $array);

print_r($array);

结果:

Array ( 11, 2, 33, 4, 5 )