2015-11-10 2 views
2

У меня есть многомерный массив, который построен, как это (не против длины строки, я изменил значение)Добавить многомерный массив в многомерном массиве в определенной позиции

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

UPDATE: попробовать 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); 

ВЫВОД:

array(4) { [0]=> array(2) { ["name"]=> string(10) "Arsenal FC" ["id"]=> string(1) "1" } [1]=> array(2) { ["name"]=> string(12) "Liverpool FC" ["id"]=> string(1) "2" } [2]=> array(2) { ["name"]=> string(10) "Chelsea FC" ["id"]=> int(4) } [3]=> array(2) { ["name"]=> string(17) "Manchester United" ["id"]=> string(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); 
?> 
+0

Ваша первая попытка намного лучше той, которую я использовал. И это работает без проблем! Спасибо! – Musterknabe

+0

@Musterknabe ваш прием. –

1

+ пытается объединить массив. Таким образом, массив вы пытаетесь добавить также должно быть многомерным

$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) 
); 
+0

Спасибо за комментарий, но когда я это сделать, как в своем комментарии, новый элемент массива не является нигде в новом массиве, то есть, когда я сбросить его, его просто нет – Musterknabe

+0

Новый массив должен иметь ключ для успешного слияния –

+0

Да, поэтому я написал, что мне нужно будет увеличить все остальные значения массива, поэтому новый элемент массива не переопределяет старые. Посмотрите мою попытку с помощью 'array_walk'. Но проблема, с которой я столкнулся, заключается в том, что я увеличил бы 4-й элемент, чтобы иметь индекс '5' и переопределить 5-й элемент массива. Мне нужно как-то увеличить все значения без переопределения других. – Musterknabe

Смежные вопросы