Удалить повторяющиеся значения из полей ссылки на сущность
Когда я импортирую фиды в поле ссылки на сущность, он создает повторяющиеся значения, которые выглядят как код ниже (используя модуль devel)
$field_tags_people['und'][0]['target_id'] = 578
$field_tags_people['und'][1]['target_id'] = 578
$field_tags_people['und'][2]['target_id'] = 594
каждый из target_id должен иметь разные значения, но оказывается, что они являются дубликатами. Я пробовал этот код
$field_tags_people['und'] = array_unique($field_tags_people['und'])
но он удаляет все термины, кроме первого. Это кажется странным из-за ключа target_id. Как я могу сделать эту работу?
2 ответа
/**
* Delete duplicate values.
*
* @param \Drupal\Core\Entity\ContentEntityInterface $entity
* Entity.
* @param string $field_name
* Field name.
* @param bool $need_save
* Save entity or not.
*
* @throws \Drupal\Core\Entity\EntityStorageException
*/
public static function deleteDuplicateValues(ContentEntityInterface $entity, string $field_name, $need_save = FALSE) {
$result = [];
/** @var \Drupal\Core\Field\EntityReferenceFieldItemListInterface $reference_field */
$reference_field = $entity->get($field_name);
$referenced_entities = $reference_field->referencedEntities();
/** @var \Drupal\Core\Entity\ContentEntityInterface $item */
foreach ($referenced_entities as $item) {
$result[$item->id()] = $item;
}
$entity->set($field_name, $result);
if ($need_save) {
$entity->save();
}
}
И используйте это как:
CLASS_NAME::deleteDuplicateValues($entity, 'tags_people');
Я решил это с помощью реализации hook_feeds_presave
в пользовательском модуле.
Следующие проверки field_my_field_name
для дубликатов в массиве по ключу value
и удаляет их до импорта / сохранения узла.
<?php
function my_module_feeds_presave(FeedsSource $source, $entity, $item) {
$items_array = $entity->field_my_field_name[LANGUAGE_NONE];
$entity->field_my_field_name[LANGUAGE_NONE] = unique_multidim_array($items_array,'value');
}
function unique_multidim_array($array, $key) {
$temp_array = array();
$i = 0;
$key_array = array();
foreach($array as $val) {
if (!in_array($val[$key], $key_array)) {
$key_array[$i] = $val[$key];
$temp_array[$i] = $val;
}
$i++;
}
return $temp_array;
}
?>
Возможно, есть лучшие способы сделать это, но вот решение.
$unique = [];
$field_tags_people['und'] = array_filter($field_tags_people['und'],
function ($val) use (&$unique) {
if (!in_array($val['target_id'],$unique)) {
$unique[] = $val['target_id'];
return true;
}
return false;
}
);
unset($unique);
Это обрезает дубликаты для вас. но следует помнить, что структура ключей не будет сброшена, поэтому вы можете использовать ключи в следующем порядке: 0, 1, 6, 7, 10
ура
РЕДАКТИРОВАТЬ: Интернет Пример: http://sandbox.onlinephpfunctions.com/code/9b4323a0b07ab8cd46b34a3715ea030f83e0b100