2016-08-25 2 views
2

Я пытаюсь добавить элемент массива в массив, если какое-либо условие встречается, прежде чем я вытащу этот массив в другой массив. Сейчас он добавляет значение как отдельный массив и не находится в том же массиве.Добавление записи в многоэлементный массив

<?php 

for ($i = 0; $i < 4; $i++) { 
    $ret1[] = array("A" . $i, "B" . $i); 
    if ($i > 2) { 
     $ret1[] = array("C" . $i); 
    } 
}  

print_r($ret1); 

?> 

Текущий результат:

Array 
(
    [0] => Array 
     (
      [0] => A0 
      [1] => B0 
     ) 

    [1] => Array 
     (
      [0] => A1 
      [1] => B1 
     ) 

    [2] => Array 
     (
      [0] => A2 
      [1] => B2 
     ) 

    [3] => Array 
     (
      [0] => A3 
      [1] => B3 
     ) 

    [4] => Array ( [0] => C3 ) 

) 

Ожидаемый результат:

Array 
(
    [0] => Array 
     (
      [0] => A0 
      [1] => B0 
     ) 

    [1] => Array 
     (
      [0] => A1 
      [1] => B1 
     ) 

    [2] => Array 
     (
      [0] => A2 
      [1] => B2 
     ) 

    [3] => Array 
     (
      [0] => A3 
      [1] => B3 
      [2] => C3 
     ) 

) 
+0

Просто создайте инструкцию if/else, и если условие выполнено, вы добавите все 3 значения внутри массива, например. '$ ret1 [] = array (a, b, c)', и вы просто добавляете a и b как массив. – Rizier123

+1

Что не работает над вашим примером? –

+0

[array_push] (http://php.net/manual/en/function.array-push.php) должен работать, просто помните, что первый аргумент, как ожидается, будет единственным массивом измерений, поэтому, если вы хотите добавить к массивам второго уровня, вам понадобится 'array_push ($ ret1 [INDEX], VALUE)' –

ответ

1

Вы можете использовать временную переменную для определения массива. Затем вы можете решить нажать еще один элемент в зависимости от вашего состояния. Наконец, вы можете нажать временный массив на ваш массив $ret1, чтобы достичь желаемого результата.

for ($i=0; $i<5; $i++) { 
    $arr = ["A$i", "B$i"]; 
    if ($i > 2) { 
     $arr[] = "C$i"; 
    } 
    $ret1[] = $arr; 
}  

Что вы делаете, толкает 2 элемента в массив в течение последних 2 итераций вашего цикла. Один со значением ["A3", "B3"], а другой со значением ["C3"], который просто приводит к [["A3", "B3"], ["C3"]], что не то, что вам нужно. Используя временную переменную $arr, мы откладываем нажатие финального массива на $ret1 до тех пор, пока не будет выполнена или не будет выполнена условная инструкция.

Так, например, в предпоследней итерации этого цикла значение $arr изначально ["A3","B3"], то мы помещаем другое значение "C3" до конца $arr на основе $i > 2 быть true, что делает $arr = ["A3","B3","C3"], и, наконец, мы помещаем $arr к конец массива $ret1 не дает нам окончательный результат [ ..., 3 => ["A3","B3","C3"], ...]

примечания бонус

ни один из этого имеет решающее значение для вашей проблемы или свой вопрос, но я решил бросить его там на всякий случай.

В PHP double quoted strings дает вам автоматическое расширение переменной. Это означает, что "A$i" === "A" . $i. Так что просто подумать. Кроме того, есть short-hand syntax for arrays, который был доступен since PHP 5.4.0, и по моему личному мнению легче писать и читать, чем использовать традиционную конструкцию array(). Итак, array("A" . $i, "B" . $i) === ["A$i", "B$i"].

+0

Очень хорошее объяснение и поздравления с поиском хорошей возможности сказать предпоследний. –

+0

Да, я обычно могу сказать это один или два раза в год, поэтому ... отлично себя чувствует, когда я это делаю :) – Sherif

+0

Спасибо за бонусные заметки. Это действительно облегчает чтение. –

1

То, что вы делаете, не давая вам результаты, которые вы ожидаете, потому что каждый раз, когда вы используете

$ret1[] = something 

PHP автоматически создает индекс новый в $ret.

Если вы хотите добавить другую строку в массив, который вы только что вставили в $ret, вы можете указать текущий ключ с $ret1[$i][] = "C" . $i; вместо $ret1[] = array("C" . $i);.

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