diff --git a/core/lib/Drupal/Core/Field/FieldItemList.php b/core/lib/Drupal/Core/Field/FieldItemList.php index 152005b..199f83c 100644 --- a/core/lib/Drupal/Core/Field/FieldItemList.php +++ b/core/lib/Drupal/Core/Field/FieldItemList.php @@ -409,7 +409,41 @@ public function equals(FieldItemListInterface $list_to_compare) { array_walk($value1, $callback); array_walk($value2, $callback); - return $value1 == $value2; + return $this->arrayEquals($value1, $value2); + } + + /** + * Determines equality to another array type-wise. + * + * @param array $array1 + * The array to compare to. + * @param array $array2 + * The array to compare to. + * + * @return bool + * TRUE if arrays are equal, FALSE if not. + */ + protected function arrayEquals(array $array1, array $array2) { + $result = TRUE; + + foreach ($array1 as $key => $value) { + if (is_array($value)) { + if (!array_key_exists($key, $array2) || !is_array($array2[$key])) { + return FALSE; + } + else { + $result = $result && $this->arrayEquals($value, $array2[$key]); + } + } + elseif (!array_key_exists($key, $array2) + || (gettype($array2[$key]) === gettype($value) && $array2[$key] !== $value) + || ($array2[$key] != $value) + ) { + return FALSE; + } + } + + return $result; } } diff --git a/core/tests/Drupal/Tests/Core/Field/FieldItemListTest.php b/core/tests/Drupal/Tests/Core/Field/FieldItemListTest.php index 83a0854..c7abc99 100644 --- a/core/tests/Drupal/Tests/Core/Field/FieldItemListTest.php +++ b/core/tests/Drupal/Tests/Core/Field/FieldItemListTest.php @@ -133,6 +133,21 @@ public function providerTestEquals() { // not exist ('3'). $datasets[] = [TRUE, $field_item_h, $field_item_i]; + /** @var \Drupal\Core\Field\FieldItemBase $field_item_j */ + $field_item_j = $this->getMockForAbstractClass('Drupal\Core\Field\FieldItemBase', [], '', FALSE); + $field_item_j->setValue(['+2']); + + // Tests field item lists where both have same values but different data + // types with leading plus. + $datasets[] = [FALSE, $field_item_e, $field_item_j]; + + /** @var \Drupal\Core\Field\FieldItemBase $field_item_k */ + $field_item_k = $this->getMockForAbstractClass('Drupal\Core\Field\FieldItemBase', [], '', FALSE); + $field_item_k->setValue(['02']); + + // Tests field item lists where string values differ. + $datasets[] = [FALSE, $field_item_j, $field_item_k]; + return $datasets; }