chỉ trong trường hợp một số người vẫn mọc lên với trang này: @ câu trả lời clockworkgeek là không đúng, ngay sau khi bạn bật chế độ nhà phát triển và hiển thị lỗi (php> = 5.4), bạn sẽ nhận được ngoại lệ và cảnh báo:
Array to string conversion in...
như giải pháp để so sánh đệ quy:
public function onCatalogProductSaveBefore($observer)
{
$product = $observer->getProduct();
if ($product->hasDataChanges()) {
$newValues = $this->_compareArrayAssocRecursive($product->getData(), $product->getOrigData());
$oldValues = $this->_compareArrayAssocRecursive($product->getOrigData(), $product->getData());
}
}
protected function _compareArrayAssocRecursive($array1, $array2)
{
$diff = array();
foreach ($array1 as $key => $value) {
if (is_array($value)) {
if (!isset($array2[$key]) || !is_array($array2[$key])) {
$diff[$key] = $value;
} else {
$newDiff = $this->_compareArrayAssocRecursive($value, $array2[$key]);
if (!empty($newDiff)) {
$diff[$key] = $newDiff;
}
}
} elseif (!array_key_exists($key,$array2) || $array2[$key] !== $value) {
$diff[$key] = $value;
}
}
return $diff;
}
Hy vọng rằng sẽ giúp Cá nhân tôi muốn giới thiệu để đưa chức năng đó vào một lớp helper và làm cho nó công cộng :)
CẬP NHẬT: theo vấn đề với các giá trị số là float và số thập phân là giải pháp tốt hơn sẽ là:
/**
* return diff according to product changes
*
* @param Mage_Catalog_Model_Product $product
* @return array
*/
protected function _compareArrayAssocRecursive($product)
{
$diff = array();
$attributes = $product->getTypeInstance(true)->getEditableAttributes($product);
foreach ($attributes as $key => $value) {
if ($product->dataHasChangedFor($key)) {
$diff[$key] = $product->getData($key);
}
}
return $diff;
}
Nguồn
2015-09-22 17:59:56
catalog_product_save_before getOrigData() là cách đi cùng. TY;) –
Tôi muốn upvote điều này ít nhất hai lần. –
Tôi nghĩ rằng thay vì sử dụng array_diff nó sẽ được array_diff_assoc –