2016-12-01 196 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