0

我正在处理迁移,并且正在迁移已标记文档的分类术语。文档中的术语用逗号分隔。到目前为止,我已经设法将每个术语分开并将其放入一个数组中,如下所示:

public function prepareRow($row) {
    $terms = explode(",", $row->np_tax_terms);
        foreach ($terms as $key => $value) {
          $terms[$key] = trim($value);
        }
        var_dump($terms);
        exit;
}

当我将它转储到终端时,这给了我以下结果:

array(2) {
  [0]=>
  string(7) "Smoking"
  [1]=>
  string(23) "Not Smoking"
}

现在我有两个字段field_onefield_two我想将数组的值 0 放入field_one并将值 1 放入field_two 例如

field_one=[0]$terms;

我知道这是不正确的,我不知道如何做这部分。请对如何执行此操作有任何建议?

4

3 回答 3

2

如果您只想将分类术语的字符串值存储到节点的不同字段中,那么以下代码应该可以解决问题:

$node->field_one['und'][0]['value'] = $terms[0];
$node->field_two['und'][0]['value'] = $terms[1];
node_save($node);

请注意,您需要先加载节点,如果您需要帮助,请在此处评论并更新我的答案。

于 2013-10-28T18:17:09.973 回答
1

您专门询问 ArrayList 和 HashMap,但我认为要完全理解发生了什么,您必须了解 Collections 框架。所以 ArrayList 实现了 List 接口,而 HashMap 实现了 Map 接口。

List:

有序集合(也称为序列)。此界面的用户可以精确控制每个元素在列表中的插入位置。用户可以通过整数索引(列表中的位置)访问元素,并在列表中搜索元素。

Map:

将键映射到值的对象。地图不能包含重复的键;每个键最多可以映射到一个值。

因此,正如其他答案所讨论的那样,列表接口 (ArrayList) 是您使用索引访问的对象的有序集合,就像数组一样(在 ArrayList 的情况下,顾名思义,它只是背景,但处理数组的很多细节都为你处理)。当您想要按排序顺序(添加它们的顺序,或者实际上是您在添加对象时指定的列表中的位置)时,您将使用 ArrayList。

另一方面,Map 接受一个对象并将其用作另一个对象(值)的键(索引)。因此,假设您有具有唯一 ID 的对象,并且您知道您将希望在某个时候通过 ID 访问这些对象,地图将使您非常轻松(并且更快/更高效)。HashMap 实现使用键对象的哈希值来定位它的存储位置,因此不再保证值的顺序。

于 2013-10-28T13:05:56.357 回答
0

You might like to try:

list($field_one, $field_two) = prepareRow($row);

The list function maps entries in an array (in order) to the variables passed by reference.

This is a little fragile, but should work so long as you know you'll have at least two items in your prepareRow result.

于 2013-10-28T12:55:57.123 回答