на всякий случай, если некоторые люди все еще подходят к этому: ответ @ clockworkgeek неверен, как только вы включите режим разработчика и отобразите ошибки (php> = 5.4), вы получите исключения и предупреждения:
Array to string conversion in...
как решение для рекурсивного сравнения:
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;
}
Надеюсь, что это поможет Лично я бы порекомендовал поместить эту функцию в вспомогательный класс и сделать его общедоступным :)
ОБНОВЛЕНИЕ : в соответствии с проблемами с числовыми значениями было с плавающей запятой и десятичной дробью, лучшее решение будет:
/**
* 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;
}