【问题标题】:Recursive replace one array with specific key with another arrays用另一个数组递归替换具有特定键的一个数组
【发布时间】:2018-08-31 14:16:59
【问题描述】:

我有一个数组,其中键 type == 'foo' 的所有数组都必须替换为自定义数组。 基本上我需要找到一个特定的数组,然后用其他数组替换它。

这里的问题是,您可以轻松替换一个数组,但是当您插入多个数组时,您正在移动键,因此下一个数组 type == 'foo' 不会被替换

任何帮助将不胜感激。

这是我所拥有的:

$array = array(
   array(
     'options' => array(
        array(
          'type' => 'foo'
        ),
        array(
          'type' => 'foo'
        ),
        array(
          'type' => 'bar'
        )
      )
   ),
   array(
     'options' => array(
        array(
          'type' => 'bar'
        ),
        array(
          'type' => 'bar'
        ),
        array(
          'type' => 'foo'
        )
      )
   ),
);

我有一个数组可以替换type == 'foo'的任何数组

$array_foo = array(
  array(
    'type' => 'custom'
  ),
  array(
    'type' => 'custom_2'
  ),
  array(
    'type' => 'anything'
  ),
);

这是所需的输出:

$array = array(
   array(
     'options' => array(
        array(
          'type' => 'custom'
        ),
        array(
          'type' => 'custom_2'
        ),
        array(
          'type' => 'anything'
        ),
        array(
          'type' => 'custom'
        ),
        array(
          'type' => 'custom_2'
        ),
        array(
          'type' => 'anything'
        ),
        array(
          'type' => 'bar'
        )
      )
   ),
   array(
     'options' => array(
        array(
          'type' => 'bar'
        ),
        array(
          'type' => 'bar'
        ),
        array(
          'type' => 'custom'
        ),
        array(
          'type' => 'custom_2'
        ),
        array(
          'type' => 'anything'
        ),
      )
   ),
);

谢谢。

【问题讨论】:

  • 到目前为止你有什么尝试?
  • @AymDev 简单的 foreach 查找数组然后取消设置它然后 array_merge 与 array_slice 插入新数据而不是未解决的数据,但正如我所说,它仅适用于第一次创建的数组
  • 很高兴您尝试过!编辑您的问题并发布您的尝试,以便我们查看问题所在并为您提供帮助。

标签: php


【解决方案1】:

这是一种使用 2 个嵌套 foreach 循环array_merge()临时数组 的方法:

// Pass the array by reference
foreach ($array as &$sub) {
    // Temporary array
    $new_options = [];
    // Loop through options
    foreach ($sub['options'] as $opt) {

        // if type foo: replace by $array_foo items
        if ($opt['type'] == 'foo') {
            $new_options = array_merge($new_options, $array_foo);

            // else, keep original item
        } else {
            $new_options[] = $opt;
        }
    }

    // replace the options
    $sub['options'] = $new_options;
}

并检查输出:

echo '<pre>' . print_r($array, true) . '</pre>';

另见Passing by Reference

【讨论】:

  • 非常感谢。它完美地工作。所以显然没有必要创建一个递归函数:)
【解决方案2】:

根据之前的帖子,修改代码的方式与以下代码类似:

$base = array("orange", "banana", "apple", "raspberry");
$replacements = array(0 => "pineapple", 4 => "cherry");
$replacements2 = array(0 => "grape");

$basket = array_replace($base, $replacements, $replacements2);
print_r($basket);

因此,使用您的方法而不是使用数字或索引,我认为您可能可以通过写下 foo 来让替换正常工作。

您可能会研究的另一件事是数组合并递归,可以在以下位置找到:http://php.net/array_merge_recursive

您在此处所说的问题与此帖子相似:PHP Array Merge two Arrays on same key

希望对你有帮助。

【讨论】:

  • 'foo' 不是键
  • 这个帖子没有说清楚,只是为了演示。
猜你喜欢
  • 2018-11-19
  • 1970-01-01
  • 2022-01-11
  • 1970-01-01
  • 2019-09-11
  • 1970-01-01
  • 1970-01-01
  • 2020-12-21
  • 1970-01-01
相关资源
最近更新 更多