2016-12-01 91 views
0

即時通訊對於PHP來說相當新穎,因爲我一直在尋找最近2小時的信息,沒有任何示例似乎有所幫助。 我有什麼我認爲被稱爲嵌套數組?他們兩個人。幾乎我需要能夠匹配來自不同陣列的id。並減少庫存的金額。PHP在foreach中更改數組值

<?php 
$items = array(
array('id' => 34, 'name' => 'Kompiuterius ASUS ASX89', 'price' => 639.00, 'stock' => 3), 
array('id' => 1008, 'name' => 'Monitorius AOC 27IPS', 'price' => 223.00, 'stock' => 7), 
array('id' => 965, 'name' => 'Tracer kilimėlis pelytei', 'price' => 2.00, 'stock' => 20), 
array('id' => 567, 'name' => 'Pelytė Logitech A52', 'price' => 16.00, 'stock' => 14), 
array('id' => 1123, 'name' => 'Klaviatūra Razer Chroma 2016', 'price' => 109.00, 'stock' => 6) 
); 
$orders = array(
array('purchase_date' => '2016-11-12', 'item_id' => 34, 'quantity' => 1), 
array('purchase_date' => '2016-11-12', 'item_id' => 1008, 'quantity' => 2), 
array('purchase_date' => '2016-11-13', 'item_id' => 965, 'quantity' => 1), 
array('purchase_date' => '2016-11-15', 'item_id' => 1123, 'quantity' => 4), 
array('purchase_date' => '2016-11-11', 'item_id' => 34, 'quantity' => 2) 
); 

foreach ($orders as $order){ 
    $purchase_id = $order['item_id']; 
    $purchase_quantity = $order['quantity']; 
    foreach ($items as $item){ 
    $stock_id = $item['id']; 
    $stock_quantity = $item['stock']; 
    if ($purchase_id == $stock_id){ 
     $stock_quantity = $stock_quantity - $purchase_quantity; 
     $item['stock'] = $stock_quantity; //something with &? 
     echo 'Prekiu, pazymetu numeriu ' . $stock_id . ' liko: ' . $stock_quantity . ' vnt. ' . '<br/>'; 
    } 
    } 
} 
?> 

這就是我的代碼。我認爲這可能會起作用,因爲在退出「if」功能之前,我會給股票賦予新的價值。但我想我錯了

$item['stock'] = $stock_quantity; 

任何建議將受到歡迎

EDIT1:什麼即時試圖做的是從$項目陣列ID從$比較ID的訂單。如果它與庫存減去數量匹配並顯示剩餘庫存。希望其更清晰

+0

你能解釋更準確地說你想要做什麼? – Perumal

+0

使用需要傳遞你想改變的數組通過引用http://stackoverflow.com/questions/3307409/php-pass-by-reference-in-foreach – markdwhite

+0

你能特別說出什麼問題嗎? – kerv

回答

1

foreach循環的工作原理是將每個值複製到一個臨時變量中。

如果你想編輯原始數組,有兩種解決方法:

無論是用引用傳遞的值,使用&

foreach ($items as &$item) { 
    /*...*/ 
    $item['stock'] = $stock_quantity; 
} 

或者使用$key=>$value符號和編輯原始陣列:

foreach ($items as $key => $item) { 
    /*...*/ 
    $items[$key]['stock'] = $stock_quantity; 
} 
+0

謝謝。添加&工作。有趣的是(因爲你看到我在代碼中的評論)我標記了&並且之前處理過,但是ti沒有工作。現在讀完這本書之後,我再次回到現在,現在它確實如此。 – NulisDefo

+0

是的,我看到了你的評論,但我想你沒有在正確的位置添加'&'。在我看來,使用第二個選項會更好(雖然編寫時間更長),因爲使用'&',在'foreach'循環關閉後仍然可以訪問最後一個引用。 [閱讀](http://php.net/manual/en/control-structures.foreach.php)。 – roberto06

+0

即時通訊,但我不明白你的意思是什麼意思,你能解釋一下嗎? – NulisDefo

1

如果您將foreach ($items as $item)更改爲foreach ($items as &$item)它將更改$ item。在變量之前添加&將使其成爲引用而不是新對象。這種方式當你改變項目時,它會改變原來的項目。

+0

謝謝。添加&工作。有趣的是(因爲你看到我在代碼中的評論)我標記了&並且之前處理過,但是ti沒有工作。現在讀完這本書之後,我再次回到現在,現在它確實如此。 – NulisDefo

+0

也許你把它和註釋放在同一行,而不是放在foreach中? –

+1

我不知道。也許我把它放在第一個foreach而不是第二個?無論如何感謝你:) – NulisDefo

1
$items = array(
    array('id' => 34, 'name' => 'Kompiuterius ASUS ASX89', 'price' => 639.00, 'stock' => 3), 
    array('id' => 1008, 'name' => 'Monitorius AOC 27IPS', 'price' => 223.00, 'stock' => 7), 
    array('id' => 965, 'name' => 'Tracer kilimėlis pelytei', 'price' => 2.00, 'stock' => 20), 
    array('id' => 567, 'name' => 'Pelytė Logitech A52', 'price' => 16.00, 'stock' => 14), 
    array('id' => 1123, 'name' => 'Klaviatūra Razer Chroma 2016', 'price' => 109.00, 'stock' => 6) 
); 
$orders = array(
    array('purchase_date' => '2016-11-12', 'item_id' => 34, 'quantity' => 1), 
    array('purchase_date' => '2016-11-12', 'item_id' => 1008, 'quantity' => 2), 
    array('purchase_date' => '2016-11-13', 'item_id' => 965, 'quantity' => 1), 
    array('purchase_date' => '2016-11-15', 'item_id' => 1123, 'quantity' => 4), 
    array('purchase_date' => '2016-11-11', 'item_id' => 34, 'quantity' => 2) 
); 

foreach ($orders as $order){ 
    $purchase_id = $order['item_id']; 
    $purchase_quantity = $order['quantity']; 

    foreach ($items as &$item){ 
     $stock_id = $item['id']; 
     $stock_quantity = $item['stock']; 

     if ($purchase_id == $stock_id) { 
      $stock_quantity = $stock_quantity - $purchase_quantity; 
      $item['stock'] = $stock_quantity; 
      echo 'Prekiu, pazymetu numeriu ' . $stock_id . ' liko: ' . $stock_quantity . ' vnt. ' . '<br/>'; 
     } 
     unset($item); 
    } 
} 

確保ÿ如果您需要操作當前元素,請在foreach的臨時變量之前添加參考&

完成foreach循環後,使用unset()函數刪除臨時變量的引用。

因此,變量將被銷燬,否則它仍然可以在foreach以外訪問,因爲它仍然是一個參考變量。

有關它的更多信息,你可以參考以下職位:

Strange behavior Of foreach