0

当我将提要导入实体引用字段时,它会创建类似于以下代码的重复值(使用开发模块)

$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 键,这看起来很奇怪。我怎样才能使这项工作?

4

3 回答 3

0
  /**
   * 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');
于 2020-05-12T08:37:49.547 回答
0

可能有更好的方法来实现这一点,但这里有一个解决方案。

$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

于 2016-12-12T19:07:50.567 回答
0

我通过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;
}
?>
于 2018-09-14T02:59:54.330 回答