Непонятки с array_push PHP

12
D
На сайте с 28.06.2008
Offline
1108
343

Есть массив

[0]=>
  array(2) {
    ["number"]=>
    string(1) "1"
    ["year"]=>
    string(4) "2013"
  }
  [1]=>
  array(2) {
    ["number"]=>
    string(1) "2"
    ["year"]=>
    string(4) "2014"
  }
  [2]=>
  array(2) {
    ["number"]=>
    string(2) "73"
    ["year"]=>
    string(4) "2015"
  }
  [3]=>
  array(2) {
    ["number"]=>
    string(1) "9"
    ["year"]=>
    string(4) "2016"
  }
  [4]=>
  array(2) {
    ["number"]=>
    string(2) "23"
    ["year"]=>
    string(4) "2017"
  }
  [5]=>
  array(2) {
    ["number"]=>
    string(2) "63"
    ["year"]=>
    string(4) "2018"
  }
  [6]=>
  array(2) {
    ["number"]=>
    string(2) "66"
    ["year"]=>
    string(4) "2019"
  }
  [7]=>
  array(2) {
    ["number"]=>
    string(1) "2"
    ["year"]=>
    string(4) "2020"
  }
}

Я пытаюсь из него сделать одномерный ассоциативный массив, делаю так

                                    $arr_reprezent =[];
                                    for ($i=0;$i<count($reprezent);$i++){
                                        array_push($arr_reprezent, $arr_reprezent[$reprezent[$i]["year"]] = $reprezent[$i]["number"]);
                                    }
                                    var_dump($arr_reprezent);

Получаю массив из 9 элементов и не могу вкурить откуда тут 9 элемент, когда исходный массив из 8 элементов?

array(9) {
  [2013]=>
  string(1) "1"
  [2014]=>
  string(1) "2"
  [2015]=>
  string(2) "73"
  [2016]=>
  string(1) "9"
  [2017]=>
  string(2) "23"
  [2018]=>
  string(2) "63"
  [2019]=>
  string(2) "66"
  [2020]=>
  string(1) "2"
  [2021]=>
  string(1) "2"
}


ArbNet
На сайте с 27.10.2019
Offline
141
#1

Когда ж вы думать то научитесь? 😀 

$i<count($reprezent)-1

ЗЫ. Лучше через combine & column это делать

Упс. Пардон с "<=" погорячился 😂

L
На сайте с 10.02.2015
Offline
249
#2
Dram :

Есть массив

Я пытаюсь из него сделать одномерный ассоциативный массив, делаю так

Получаю массив из 9 элементов и не могу вкурить откуда тут 9 элемент, когда исходный массив из 8 элементов?


На первый взгляд попахло говнокодом.

Секрет в этой конструкции:

$arr_reprezent[$reprezent[$i]["year"]] = $reprezent[$i]["number"]

Оно инициализирует массив 

$arr_reprezent

с 2013, а потом добавляет элементы в конец массива

D
На сайте с 28.06.2008
Offline
1108
#3
ArbNet #:
<=

В моем понимании равно тут лишь увеличит итерацию в цикле на единицу, но я все равно попробовал и получил

array(11) {
  [2013]=>
  string(1) "1"
  [2014]=>
  string(1) "2"
  [2015]=>
  string(2) "73"
  [2016]=>
  string(1) "9"
  [2017]=>
  string(2) "23"
  [2018]=>
  string(2) "63"
  [2019]=>
  string(2) "66"
  [2020]=>
  string(2) "2"
  [2021]=>
  string(2) "2"
  [""]=>
  NULL
  [2022]=>
  NULL
}

По прежнему причину такого поведения (появления 9 элемента) не поннимаю

D
На сайте с 28.06.2008
Offline
1108
#4
livetv #:

На первый взгляд попахло говнокодом.

Секрет в этой конструкции:

Оно инициализирует массив 

с 2013, а потом добавляет элементы в конец массива

Ну как бы этого я и добивался. Откуда там 2021 год то взялся?

L
На сайте с 10.02.2015
Offline
249
#5
Dram #:

Ну как бы этого я и добивался. Откуда там 2021 год то взялся?

Начинаем с 2013 и добавляем 8 элементов

D
На сайте с 28.06.2008
Offline
1108
#6
livetv #:

Начинаем с 2013 и добавляем 8 элементов

А как сделать правильно - count($reprezent)-1?

L
На сайте с 10.02.2015
Offline
249
#7
Dram #:

А как сделать правильно - count($reprezent)-1?

Можете убрать array_push и в цикле оставить только

$arr_reprezent[$reprezent[$i]["year"]] = $reprezent[$i]["number"];
D
На сайте с 28.06.2008
Offline
1108
#8
livetv

спасибо!


ArbNet #:

Когда ж вы думать то научитесь? 😀 

$i<=count($reprezent)-1

Очень иронично - понтануться про "когда вы уже думать научитесь" и предложить нерабочую ерись  )))

W1
На сайте с 22.01.2021
Offline
306
#9
Dram #:
Откуда там 2021 год то взялся?

Он по порядку следует после2020. При добавлении элемента в конец массива ему присваивается индекс, равный максимальному +1.

Мой форум - https://webinfo.guru –Там я всегда на связи
S
На сайте с 13.10.2014
Offline
171
#10

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

$arr_reprezent =[];
for ($i=0;$i<count($reprezent);$i++){
         $arr_reprezent[$reprezent[$i]["year"]] = $reprezent[$i]["number"];
}
или присваиванием через обход массива foreach
$arr_reprezent =[];
foreach ($reprezent as $value){
        $arr_reprezent[$value["year"]] = $value["number"];
}
var_dump($arr_reprezent);

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

аналогичный вариант с циклами for  будет выглядеть вот так. очень заморочено, надо сказать.

$arr_reprezent =[];
$reprezent_size = sizeof($reprezent);
reset($reprezent);

for ($i=0;$i<$reprezent_size;$i++){
        $value = current($reprezent);
        $arr_reprezent[$value["year"]] = $value["number"];
        next($reprezent);
}

var_dump($arr_reprezent);

Зачем такое усложнение. Это нужно для того, чтобы исключить влияние ключей в массиве, ибо оные могут быть вида  0,1,2,a,1324,6134,qwerty
разумеется если перебирать массив с неупорядоченными ключами, то результирующий массив будет непредсказуем.

как вариант - это создать промежуточный массив путем применения функции array_values к массиву $reprezent

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

12

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий