将数组作为另一个数组中的单个项传递

时间:2016-12-26 05:01:43

标签: php arrays drupal

我有这个数组

$arr = ['field_event_start_date', 'widget', 0, 'value', '#date_part_order', 3]

我想以下面的格式将其转换为此数组

$form['field_event_start_date']['widget'][0]['value']['#date_part_order'][3]

尝试将数组附加到$form数组。

我有一个$form数组,其中包含许多字段,我想取消设置一组字段。上面的数组是更大数组的一部分。如果我采用这个数组,我如何将其转换为如下所示的数组

$form['field_event_start_date']['widget'][0]['value']['#date_part_order'][3]

我试过,像这样崩溃$form[implode('][', $arr)]但这总是说,未定义的索引。

我需要运行的最终代码是

unset($form['field_event_start_date']['widget'][0]['value']['#date_part_order'][3]);

然而,有很多这样的,深度变化的数量。我需要编写一个通用函数来实现这一目标。

2 个答案:

答案 0 :(得分:1)

在Drupal 8中,您可以使用NestedArray::unsetValue()取消设置嵌套数组的值。您还可以使用NestedArray::getValue()NestedArray::setValue()使用一组键($parents)从嵌套数组中获取和设置值。

Drupal 7只有drupal_array_get_nested_value()drupal_array_set_nested_value()。但没有drupal_array_unset_nested_value()。它可以很容易地从Drupal 8移植:

/**
 * Unsets a value in a nested array with variable depth.
 *
 * This helper function should be used when the depth of the array element you
 * are changing may vary (that is, the number of parent keys is variable). It
 * is primarily used for form structures and renderable arrays.
 *
 * @param array $array
 *   A reference to the array to modify.
 * @param array $parents
 *   An array of parent keys, starting with the outermost key and including
 *   the key to be unset.
 * @param bool $key_existed
 *   (optional) If given, an already defined variable that is altered by
 *   reference.
 *
 * Port of NestedArray::unsetValue() from Drupal 8
 *
 * @see drupal_array_get_nested_value()
 * @see drupal_array_set_nested_value()
 */
function drupal_array_unset_nested_value(array &$array, array $parents, &$key_existed = NULL) {
  $unset_key = array_pop($parents);
  $ref = &drupal_array_get_nested_value($array, $parents, $key_existed);
  if ($key_existed && is_array($ref) && array_key_exists($unset_key, $ref)) {
    $key_existed = TRUE;
    unset($ref[$unset_key]);
  }
  else {
    $key_existed = FALSE;
  }
}

答案 1 :(得分:0)

这个怎么样:

eval("\$form['".implode("']['", $arr)."']='';");