【问题标题】:Find and add to an associative array in an unknown multidimensional array在未知多维数组中查找并添加到关联数组
【发布时间】:2019-10-18 13:41:16
【问题描述】:

我正在尝试通过将数组添加到数组来创建自填充树。我遇到的问题是在数组中找到一个关联键,然后向它添加新内容(一个新数组)。

我该如何解决这个问题?

【问题讨论】:

  • 欢迎来到 Stack Overflow!提问前请阅读what this site is about 和“How to ask”。您能否为您迄今为止尝试过的内容添加一些代码
  • 您的问题到底是什么?你试过什么?

标签: php search multidimensional-array key associative-array


【解决方案1】:

这可以递归完成。您可以在主数组中搜索键并将该值[s] 与您要附加/插入的数据合并。

下面我创建了两个函数来实现这一点。

/** Append or create to an array searching for the index with the with the value $key. If $key is set to null, append to array using numerical index.
 * @param array $masterArray Array to append to
 * @param mixed $data
 * @param null  $key         If not set, will append to the master array
 */
function append($key, $data, &$masterArray) {
    if($key===null) {
        $masterArray[] = $data;
    } else if(!_appendHelper($key, $data, $masterArray)) {
        $masterArray[$key] = $data;
    }
}

/** Helper function to recursively search/merge array */
function _appendHelper($key, $data, &$masterArray) {
    foreach($masterArray as $k => &$v) {
        if($k===$key) {
            $v = array_merge($v, is_array($data) ? $data : [$data]);
            return true;
        } elseif(is_array($v)) {
            _appendHelper($key, $data, $v);
        }
    }
    return false; // Key does not exist
}


$masterArray = ['foo' => ['bar' => ['ram' => ['ewe' => []]]], ['man' => ['chu' => []]]];

append('foo', ['__TEST1__' => [1, 1, 1]], $masterArray);
print_r($masterArray);

append('new_key', ['__TEST2__' => [2, 2, 2]], $masterArray);
print_r($masterArray);

append(null, ['__TEST3__' => [3, 3, 3]], $masterArray);
print_r($masterArray);

【讨论】:

  • 不幸的是,我不知道钥匙的位置或深度。我需要一种方法来搜索,然后一旦找到,就向其中添加新内容。
  • 密钥可以存在于不同的层级吗?即:['foo'=>['foo'=>['foo'=>[1,2,...]]]
  • 认为它更像:['foo' => ['bar' => ['ram' => ['ewe' => [] ]]], ['man' => ['chu' =>[] ]],但它可以无限期地继续下去。我需要能够随时访问这些密钥中的任何一个并添加到它们。
  • @IanTelke 我已经更新了我的代码以适应您的最后评论。我相信这就是您正在寻找的。​​span>
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-08-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多