2012-02-19 56 views
2

好吧,我正在做一些數據挖掘工作,但是我在一個循環中更改了一個數組(通過覆蓋之前的數組值),並顯示它們已被更改但是一旦我得到一個更大的循環之外,這些值就會變回原來的值。對PHP陣列的更改不是「堅持」

可能更容易舉一個例子:

它開始這樣,轉彎一堆陣列的部分的成單詞「一致」。

現在,如果我要立即轉儲數組的值,它會顯示一些值已更改爲「匹配」(即更改值後,我會回顯數組插槽,它會顯示它的值是「MATCH」)之後,但是我得到的循環數組變回它外面的原始內容

下面是代碼的壓縮版本:

//i've got this big loop for doing the main work 
do { 
      //Set dat ticker 
      $q = 0; 

      // Run through entire previous scrape array to check for matches and mark them as unchanged 
      do { 
      if ($itemTitle[$i] == $prodURLS[$q]) { 
       $prodURLS[$q] = "MATCH"; 
       echo "When the value is printing immediately it shows that it's changed: ".$prodURLS[$q]."<br>"; 
      } 
      $q++; 
      } while ($q < $urlArraySize); 
$i++; 
} while ($i < $itemtitleArraySize); 

//如果我嘗試打印變量在這裏它將被恢復爲像之前我將其更改爲「MATCH」 print_r($ prodURLS);

+1

可以壓縮代碼,但我想看看'$ itemTtle'和'$ prodURLS'在哪裏獲取它們的值會很有用。 – madth3 2012-02-19 02:41:22

+0

這是從一個函數內調用嗎?例如'do_work($ itemTitle,$ prodURLS);' – raser 2012-02-19 04:08:58

回答

1

從運行代碼,設置變量如下,它爲我工作:

$prodURLS = array('a','b','c'); 
$itemTitle = array('a'); 
$urlArraySize = count($prodURLS); 
$itemtitleArraySize = count($itemTitle); 
$i = 0; 

我只有這一數額的信息僅僅是建議,分別是:

  • 爲了提供更多的背景信息,正如madth3所暗示的那樣。
  • 檢查您設置/檢查值的範圍。您可能需要&運算符通過引用傳遞變量,或使用global關鍵字來使用全局變量。
  • 要使用foreach循環,它將使您的代碼更小,更易於閱讀。此外,您不需要計算陣列的大小,並具有其他優點,例如,在關聯數組的使用中。再次,請注意通過引用使用變量。例如:

    foreach ($itemTitle as $item) { 
        foreach ($prodURLS as &$prod) { 
         if ($item == $prod) { 
          $prod = 'MATCH'; 
         } 
        } 
    } 
    unset($prod); //Unset variable set by reference if you are going to use it later on! 
    
  • 此外,您可能會發現一些有用的像array_walk PHP的陣列功能。查看array functions reference上的PHP手冊。

真的,沒有太多可以從你提供的代碼說。

祝你好運。