将项添加到多维数组中的父项

时间:2018-04-22 22:05:24

标签: php arrays

我有一个多维数组,如下所示:

$importer = new CsvImporter("small.txt",true,":"); 
$data = $importer->get(); 
echo json_encode($data); 

[{
    "\ufeff#product_num": "5",
    "name": "tv",
    "cost": "59.99"
},
{
    "\ufeff#product_num": "7",
    "name": "radio",
    "cost": "10.99"
}]

所以,我可以在树结构中添加另一个数组:

$items = array(
    'one' => array(
        'a' => array(),
        'b' => array(),
        'c' => array()
    ),
    'two' => array(
        'd' => array(),
        'e' => array(),
        'f' => array()
    ),
    'three' => array(
        'g' => array(),
        'h' => array(),
        'i' => array()
    )
);

但如果我不知道$items['one']['c'][] = array( 'j' => array() ); c范围内,我该怎样才能实现这一目标?我查看了one,但只返回array_search。我认为那是因为我所寻找的并不是在阵列的最顶层?

我知道false存在,但我不知道它在哪个子阵列中以及它走多远。这可能吗?

3 个答案:

答案 0 :(得分:1)

如果我理解正确,这个功能会做你想要的:

<?php

$items = array(
    'one' => array(
        'a' => array(),
        'b' => array(),
        'c' => array()
    ),
    'two' => array(
        'd' => array(),
        'e' => array(),
        'f' => array()
    ),
    'three' => array(
        'g' => array(),
        'h' => array(),
        'i' => array()
    )
);

function addToSub($items, $key, $addItem) {
   foreach($items as &$item) {
       if (in_array($key, array_keys($item))) {
           $item[$key][] = $addItem;
       }
   }
    return $items;
}

$items = addToSub($items, 'c', array( 'j' => array() ));

echo "<pre>";
var_dump($items);
echo "</pre>";

输出:

array(3) {
  ["one"]=>
  array(3) {
    ["a"]=>
    array(0) {
    }
    ["b"]=>
    array(0) {
    }
    ["c"]=>
    array(1) {
      [0]=>
      array(1) {
        ["j"]=>
        array(0) {
        }
      }
    }
  }

答案 1 :(得分:0)

我认为你正在实施一棵树。 您要做的第一件事就是找到要附加孩子的节点。 (在您的示例中,节点为c,子节点为j)

通过递归实现DFS搜索,我编写了以下代码。 (确保您正在搜索的节点存在,否则该函数将返回空数组)

<?php

$arr = [
    'one' => [
        'a' => [],
        'b' => [],
        'c' => [],
    ],
    'two' => [
        'd' => [],
        'e' => [],
        'f' => [],
    ],
    'three' => [
        'g' => [],
        'h' => [],
        'i' => [],
    ],
];

$arr = insertArr($arr, 'c', 'j');

print_r($arr);

function insertArr(array $arr, string $key, string $new): array {
    // If key is found in $arr, append the child and return it.
    if (array_key_exists($key, $arr)) {
        $arr[$key][$new] = [];
        return $arr;
    }

    // search the key in child node(next dimention)
    foreach ($arr as $subArrKey => $subArr) {
        // result will be empty if the key is not in child $subArr
        $result = insertArr($subArr, $key, $new);
        if (!empty($result)) {
            // If the key is found in $subArr, 
            // replace $subArr with $result, 
            // which is the same as the $subArr but appended with child.
            $arr[$subArrKey] = $result;
            return $arr;
        }
    }

    return [];
}

现在,您可以将'k'附加到'one','c'或'j'。 要将'k'附加到'j',只需写下:

$arr = insertArr($arr, 'j', 'k');

答案 2 :(得分:0)

array_search将查找一个值,在您的示例中,所有子数组都为空。

如果我没有弄错的话,您可以使用array_map并针对每个子阵列检查您是否存在使用array_key_exists寻找的密钥:

$result = array_map(function($item) {
    if (array_key_exists("c", $item)) {
        $item["c"]["j"] = [];
    }
    return $item;
}, $items);

Demo