我有一个功能: 从数据库中获取序列化数组, 反序列化, 将一个项添加到数组的末尾, 序列化它 并使用新数组更新数据库。
当我自己运行该函数时,这工作正常。我可以刷新页面,每次它都会向数组中添加一个项目。当我print_r数组时,我可以看到它已将我的新项目添加到数组中,为其分配下一个可用的数字键。
然而,当我在foreach循环中运行此函数而不是在每个循环中添加一个项目时,它会在第一个循环中添加一个项目,然后在每个循环之后添加一个项目,之后它只修改在第一个循环中创建的项目。
public function updateImage($image, $product_id)
{
// Some code here to write the file, not relevant to my question.
// Process the $image parameter to get $image_src.
// The product images are held in an array.
// Get the serialized array from the database
$objProduct = $this->Database->prepare("SELECT name, images FROM tl_iso_products WHERE id = ?")->execute($product_id);
$images = array();
// Unserialize the result to get the array of images
$images = unserialize($objProduct->images);
// Add the new image to the array
$images[] = array(
'src' => $image_src,
'alt' => $objProduct->name,
'link' => '',
'desc' => '',
'translate' => '',
);
// Update the database with the new array
$this->Database->prepare("UPDATE tl_iso_products SET images = ? WHERE id = ?")->execute(serialize($images),$product_id);
}
这是数组的开头,只有一个图像:
Array
(
[0] => Array
(
[src] => image1.jpg
[alt] => Image alt text
[link] =>
[desc] =>
[translate] =>
)
)
刷新页面以使该功能运行几次,每次更改图像名称:
Array
(
[0] => Array
(
[src] => image1.jpg
[alt] => Image alt text
[link] =>
[desc] =>
[translate] =>
)
[1] => Array
(
[src] => image2.jpg
[alt] => Image alt text
[link] =>
[desc] =>
[translate] =>
)
[2] => Array
(
[src] => image3.jpg
[alt] => Image alt text
[link] =>
[desc] =>
[translate] =>
)
)
在foreach循环中运行该函数,该函数应具有与上述相同的效果:
Array
(
[0] => Array
(
[src] => image1.jpg
[alt] => Image alt text
[link] =>
[desc] =>
[translate] =>
)
[1] => Array
(
[src] => image3.jpg
[alt] => Image alt text
[link] =>
[desc] =>
[translate] =>
)
)
不是在每次循环时添加新项目,而是在第一个循环中添加一个新项目,然后在每个循环之后覆盖它。
每次循环时,都应从数据库中获取数组,该数组将由前一个循环更新。知道为什么不发生这种情况的任何想法?
这是所请求的foreach循环,它运行一个数组,其中包含图像网址和需要添加到的产品的ID:
foreach($arrImages as $image)
{
$this->updateImage($image['url'], $image['product_id']);
}