2014-01-26 92 views
0

我有兩個數組。 第一個($ DCEL)看起來是這樣的:無法修改多維數組PHP

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內如果statment,輸出是正確的答案,但如果我嘗試修改$ latura [V1]的$ DCEL保持不變。 我已經嘗試過參考,鍵...但沒有任何作品,我看不出有什麼問題。

+0

所以'的foreach($德爾爲&$ {latura'沒有工作? –

+0

,因爲這適用於我,使用您的代碼(除了我必須將您的初始數組中[V1]的值更改爲'1',因爲在您的發佈示例中沒有任何內容可以匹配)。 sidenote,你應該把你的聯想索引包裝在你爲'old'和'new'做的引號中,但是它也應該爲'$ latura ['V1']完成。 –

+0

好吧,如果這沒有奏效,那麼在其他代碼的其他地方還有別的東西,除此之外。 IOW發佈的內容是正確的,問題在其他地方 –

回答

0

這工作:

編輯:增加了2個數組元素,以$ 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 
     ) 

) 
+0

給''dcel'分配給我,工作。它只是將第一個找到的值複製到$ latura [V1] – tbutcaru

+0

@TaseButcaru的其餘部分,這甚至沒有意義。 「你的意思是」$ latura [V1]'的其餘部分嗎?我的意思是 –

+0

的後置示例輸出是指$ dcel中的下一個數組 – tbutcaru

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; 
} 

...但我不知道爲什麼。

+0

在你的foreach循環中,'$ key'和'$ value'是用於'foreach'迭代的臨時變量。它們不是引用實際的'$ dcel'數組的永久變量。因此,在第一次嘗試中,'$ latura'等價於'$ value',並且是一個臨時變量。這就是爲什麼你使用'&'前綴來讓php引用'$ dcel'數組本身。所以這裏這個方法是可行的,因爲不是像'$ value [V1]'這是一個temp變量,你直接用'$ dcel [$ key] [V1]' –

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而不是by-refe倫斯。基於這個原因,你有2個解決方案,

  • 使用for $dcel as $key => $latura則可以更改$dcel[$key]
  • 使用for $dcel as &$latura那麼你可以更改的項目直接
+0

我不能使用array_walk(不建議使用) - 可能不同PHP版本和array_map,不會修改$ dcel數組。問題是在別的地方... – tbutcaru

+0

奇怪,http://fi2.php.net/array_walk我沒有看到任何棄用提到那裏。至於'array_map',是的它不修改項目,但它確實構建了一個新的數組與修改項目(不知道它是否適合您的情況) –

+0

這就是我得到的「棄用:呼叫時間傳遞 - 參考已被廢棄......「。 無論如何,我得到它與下面的代碼工作。謝謝! – tbutcaru

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)