在特定位置添加多维数组到多维数组中

4

我有一个多维数组,它是这样构建的(不要在意字符串长度,我修改了值)

array(27) {
  [0]=>
  array(2) {
    ["name"]=>
    string(16) "Arsenal FC"
    ["id"]=>
    string(2) "1"
  }
  [1]=>
  array(2) {
    ["name"]=>
    string(8) "Liverpool FC"
    ["id"]=>
    string(3) "2"
  }
[2]=>
  array(2) {
    ["name"]=>
    string(18) "Manchester United"
    ["id"]=>
    string(3) "3"
  }
}

现在我想添加一个数组,它的构建方式如下所示。
array(2) {
  ["name"]=>
  string(18) "Chelsea FC"
  ["id"]=>
  string(3) "4"

在第二个和第三个数组元素之间。

我已经像这样做了

$this->clubs = array_slice($this->clubs, 0, 2, true) +
['name' => 'Chelsea FC', 'id' => 4] +
array_slice($this->clubs, 2, sizeof($this->clubs), true);

然而,这将返回以下数组。
array(27) {
  [0]=>
  array(2) {
    ["name"]=>
    string(16) "Arsenal FC"
    ["id"]=>
    string(2) "1"
  }
  [1]=>
  array(2) {
    ["name"]=>
    string(8) "Liverpool FC"
    ["id"]=>
    string(3) "2"
  }
  ["name"]=>
  string(20) "Chelsea FC"
  ["id"]=>
  int(4)
  [2]=>
  array(2) {
    ["name"]=>
    string(18) "Manchester United"
    ["id"]=>
    string(3) "3"
  }

正如您所看到的,数组已添加到正确的位置,但格式不正确(不是多维的)。现在我需要做的是在该位置添加数组并增加所有其他索引的计数。

我尝试像这样实现它

if ($otherClubs->count() > 0) {

    array_walk($this->clubs, function($item, $key) use($index, $otherClubs) {
        if ($key > $index) {
            $this->clubs[$key + $otherClubs->count()] = $item;
            unset($this->otherClubs[$key]);
        }
    });
}

但这将彻底破坏数组

array(36) {
  [0]=>
  array(2) {
    ["name"]=>
    string(16) "Arsenal FC"
    ["id"]=>
    string(2) "1"
  }
  [1]=>
  array(2) {
    ["name"]=>
    string(8) "Liverpool FC"
    ["id"]=>
    string(3) "2"
  }
  ["name"]=>
  string(20) "Chelsea FC"
  ["id"]=>
  int(3)
  [2]=>
  array(1) {
    ["id"]=>
    string(3) "4"
  }

我该如何实现这个?
2个回答

4

更新: 尝试使用 array_splice: 选项1更好,更简洁,并且可以保留键。

1):

$arr=array (
    '0'=>
    array(
        "name"=>"Arsenal FC",
        "id"=>"1"
    ),
    '1'=>
    array(
        "name"=>"Liverpool FC",
        "id"=>"2"
    ),
    '2'=>
    array(
        "name"=>"Manchester United",
        "id"=>"3"
));

array_splice($arr, 2, 0, array(array('name' => 'Chelsea FC', 'id' => 4)));
echo "<pre>";
var_dump($arr);

输出:

数组(4) { [0]=> 数组(2) { ["name"]=> 字符串(10) "阿森纳足球俱乐部" ["id"]=> 字符串(1) "1" } [1]=> 数组(2) { ["name"]=> 字符串(12) "利物浦足球俱乐部" ["id"]=> 字符串(1) "2" } [2]=> 数组(2) { ["name"]=> 字符串(10) "切尔西足球俱乐部" ["id"]=> 整数(4) } [3]=> 数组(2) { ["name"]=> 字符串(17) "曼彻斯特联队" ["id"]=> 字符串(1) "3" } }

或者您自己的尝试风格。

2):

<?php 
$arr=array (
    '0'=>
    array(
        "name"=>"Arsenal FC",
        "id"=>"1"
    ),
    '1'=>
    array(
        "name"=>"Liverpool FC",
        "id"=>"2"
    ),
    '2'=>
    array(
        "name"=>"Manchester United",
        "id"=>"3"
));


$arr = array_values(array_slice($arr, 0, 2, true) + array(sizeof($arr)=>array('name' => 'Chelsea FC', 'id' => 4)) + array_slice($arr, 2, sizeof($arr), true));
echo "<pre>";
var_dump($arr);
?>

你的第一次尝试比我用过的要好得多。而且它没有问题!谢谢你! - Musterknabe

2
+ 尝试合并数组。因此,您要添加的数组也应该是多维的。
$this->clubs = array_slice($this->clubs, 0, 2, true) +
[1 => ['name' => 'Chelsea FC', 'id' => 4]] +
array_slice($this->clubs, 2, sizeof($this->clubs), true);

缺点是您需要提供要添加的数组的键。
或者您可以使用array_merge
$this->clubs = array_merge(
    array_slice($this->clubs, 0, 2, true),
    [['name' => 'Chelsea FC', 'id' => 4]],
    array_slice($this->clubs, 2, sizeof($this->clubs), true)
);

新数组必须有一个键才能成功合并。 - Stijn Janssen
是的,这就是为什么我写道,我需要增加所有其他数组值,以便新的数组元素不会覆盖旧的元素。请查看我的array_walk尝试。但我在那里遇到的问题是,我将增加第4个元素以获得索引5并覆盖第5个数组元素。我需要以某种方式增加所有值而不覆盖其他值。 - Musterknabe
如果您不想提供键,则可以使用array_merge(http://php.net/manual/en/function.array-merge.php)。 - Stijn Janssen
array_merge函数不保留键名,而且我不能随意创造一个新的键名。然而,这让我想到了另一个解决方案。我只需添加一个由名称和ID的md5哈希值生成的键名(以确保唯一性)。[md5($club->name . $club->id) => ['name' => ' - ' . $club->name, 'id' => $club->id]] +看起来这个方法有效。 - Musterknabe
让我们在聊天中继续这个讨论 - Stijn Janssen
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接