За последние 24 часа нас посетили 18328 программистов и 1665 роботов. Сейчас ищут 1136 программистов ...

array_splice() Вставка элементов в ассоциативный массив

Тема в разделе "PHP для новичков", создана пользователем dedyukhinnp, 7 ноя 2024.

  1. dedyukhinnp

    dedyukhinnp Новичок

    С нами с:
    18 окт 2024
    Сообщения:
    10
    Симпатии:
    1
    Здравствуйте, уважаемые!

    Я изучаю функции PHP.
    Добрался сейчас до array_splice.
    Код (Text):
    1. array_splice($capitals, 1, 0, $komi); //$capitals - массив, в который будем вставлять, 1 - это начиная с какого индекса в массиве будем вставлять, 0 - это сколько элементов хотим удалить, $komi - массив из которого будем вставлять значения
    В учебнике написано, что эта функция умеет вставлять значения в массивы.
    Проверил на обычном массиве - да, умеет.
    Еще в учебнике написано, что она умеет вставлять значения в ассоциативные массивы (когда определены парами ключ-значение).
    Проверил на ассоциативном массиве - почему-то ключ становится равным нулю (0). Ошибка.
    Код (Text):
    1. Вывод:
    2. Array ( [Свердловская обл.] => Екатеринбург [0] => Сыктывкар [Пермский край] => Пермь [Ханты-Мансийский АО] => Ханты-Мансийск [Тюменская обл.] => Тюмень [Курганская обл.] => Курган [Челябинская обл.] => Челябинск [респ. Башкортостан] => Уфа )
    Кто-нибудь знает почему?

    У меня такойкод:

    Код (Text):
    1. <?php
    2.         $capitals = array(
    3.         'Свердловская обл.' => "Екатеринбург",
    4.         'Пермский край' => "Пермь",
    5.         'Ханты-Мансийский АО' => "Ханты-Мансийск",
    6.         'Тюменская обл.' => "Тюмень",
    7.         'Курганская обл.' => "Курган",
    8.         'Челябинская обл.' => "Челябинск",
    9.         'респ. Башкортостан' => "Уфа"
    10.         );
    11.         $komi = array('респ. Коми' => "Сыктывкар");
    12.         array_splice($capitals, 1, 0, $komi);
    13.         print_r($capitals);
    14.         ?>
     
  2. Vladimir Kheifets

    Vladimir Kheifets Новичок

    С нами с:
    23 сен 2023
    Сообщения:
    424
    Симпатии:
    79
    Адрес:
    Бавария, Германия
    Добрый день!
    Эта функция имеет
    PHP:
    1. function array_splice_assoc(array &$original, int $offset, int $length = 0, $replacement = null) {
    2.     $slice = array_slice($original, 0, $offset, true);
    3.  
    4.     if (!is_null($replacement)) {
    5.         // cast to array
    6.         $replacementArray = is_array($replacement) ? $replacement : [$replacement];
    7.  
    8.         $slice = array_merge($slice, $replacementArray);
    9.     }
    10.  
    11.     $original = array_merge($slice, array_slice($original, $offset+$length, null, true));
    12.  
    13.     return $original;
    14. }
    источник https://gist.github.com/khanzadimahdi/86fc594649ac9f8bf6aba2e943a9940a
    PHP:
    1. $capitals = array(
    2. 'Свердловская обл.' => "Екатеринбург",
    3. 'Пермский край' => "Пермь",
    4. 'Ханты-Мансийский АО' => "Ханты-Мансийск",
    5. 'Тюменская обл.' => "Тюмень",
    6. 'Курганская обл.' => "Курган",
    7. 'Челябинская обл.' => "Челябинск",
    8. 'респ. Башкортостан' => "Уфа"
    9. );
    10. print_r($capitals);
    11. $komi = array('респ. Коми' => "Сыктывкар");
    12. print_r($komi);
    13. array_splice_assoc($capitals, 1, 0, $komi);
    14. print_r($capitals);
    15. /*
    16. Array
    17. (
    18.     [Свердловская обл.] => Екатеринбург
    19.     [Пермский край] => Пермь
    20.     [Ханты-Мансийский АО] => Ханты-Мансийск
    21.     [Тюменская обл.] => Тюмень
    22.     [Курганская обл.] => Курган
    23.     [Челябинская обл.] => Челябинск
    24.     [респ. Башкортостан] => Уфа
    25. )
    26.  
    27. Array
    28. (
    29.     [респ. Коми] => Сыктывкар
    30. )
    31.  
    32. Array
    33. (
    34.     [Свердловская обл.] => Екатеринбург
    35.     [респ. Коми] => Сыктывкар
    36.     [Пермский край] => Пермь
    37.     [Ханты-Мансийский АО] => Ханты-Мансийск
    38.     [Тюменская обл.] => Тюмень
    39.     [Курганская обл.] => Курган
    40.     [Челябинская обл.] => Челябинск
    41.     [респ. Башкортостан] => Уфа
    42. )
    43. */
    Улачи!
     
    dedyukhinnp нравится это.
  3. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.103
    Симпатии:
    1.243
    Адрес:
    там-сям
    Действительно неинтуитивное поведение функции.
    Вот мой вариант
    PHP:
    1. <?php
    2.  
    3. $capitals = [
    4.     'Свердловская обл.' => 'Екатеринбург',
    5.     'Пермский край' => 'Пермь',
    6.     'Ханты-Мансийский АО' => 'Ханты-Мансийск',
    7.     'Тюменская обл.' => 'Тюмень',
    8.     'Курганская обл.' => 'Курган',
    9.     'Челябинская обл.' => 'Челябинск',
    10.     'респ. Башкортостан' => 'Уфа'
    11. ];
    12. $komi = ['респ. Коми' => 'Сыктывкар'];
    13.  
    14. $keys = array_keys($capitals);
    15. array_splice($keys, 1, 0, array_keys($komi));
    16.  
    17. $values = array_values($capitals);
    18. array_splice($values, 1, 0, array_values($komi));
    19.  
    20. $capitals = array_combine($keys, $values);
    21. var_export($capitals);
     
    dedyukhinnp нравится это.
  4. Vladimir Kheifets

    Vladimir Kheifets Новичок

    С нами с:
    23 сен 2023
    Сообщения:
    424
    Симпатии:
    79
    Адрес:
    Бавария, Германия
    Добрый день!
    Очевидно, что функция array_splice без дополнительных манипуляций не подходит для
    вставки элементов в ассоциативный массив.
    Однако можно сделать это использую функцию array_slice
    PHP:
    1. <?
    2. echo "<pre>";
    3. $capitals = array(
    4. 'Свердловская обл.' => "Екатеринбург",
    5. 'Пермский край' => "Пермь",
    6. 'Ханты-Мансийский АО' => "Ханты-Мансийск",
    7. 'Тюменская обл.' => "Тюмень",
    8. 'Курганская обл.' => "Курган",
    9. 'Челябинская обл.' => "Челябинск",
    10. 'респ. Башкортостан' => "Уфа"
    11. );
    12.  
    13. $komi = array('респ. Коми' => "Сыктывкар");
    14.  
    15. $offset=1;
    16. $start=hrtime(true);
    17. #######################################################################
    18. $capitals = array_merge(array_slice($capitals, 0, $offset, true), $komi,
    19. array_slice($capitals, $offset, NULL, true));
    20. #######################################################################
    21. $end=hrtime(true);
    22. $eta=$end-$start;
    23. var_export($capitals);
    24. echo "<hr>";
    25. echo $eta/1e+6;
    26. /*
    27. array (
    28.   'Свердловская обл.' => 'Екатеринбург',
    29.   'респ. Коми' => 'Сыктывкар',
    30.   'Пермский край' => 'Пермь',
    31.   'Ханты-Мансийский АО' => 'Ханты-Мансийск',
    32.   'Тюменская обл.' => 'Тюмень',
    33.   'Курганская обл.' => 'Курган',
    34.   'Челябинская обл.' => 'Челябинск',
    35.   'респ. Башкортостан' => 'Уфа',
    36. )
    37. 0.0052
    38. */
    39. ?>
    Сравнение по времени выполнения
    Код с array_splice: 0.0052
    Ваш вариант: 0.0079
    функуция array_splice_assoc: 0.0087
    Удачи!
     
    #4 Vladimir Kheifets, 13 ноя 2024
    Последнее редактирование: 13 ноя 2024
    dedyukhinnp нравится это.
  5. Drunkenmunky

    Drunkenmunky Активный пользователь

    С нами с:
    12 авг 2020
    Сообщения:
    1.484
    Симпатии:
    281
    ТС обратного и не заявлял
    Остается уточнить, где он это вычитал, и поглумиться над автором сего опуса.При условии, что ТС понял всё правильно.
     
  6. Vladimir Kheifets

    Vladimir Kheifets Новичок

    С нами с:
    23 сен 2023
    Сообщения:
    424
    Симпатии:
    79
    Адрес:
    Бавария, Германия
    Добрый день!
    см. результат выдаваемый функцией array_splice($capitals, 1, 0, $komi) без дополнительных манипуляций
    Как говорил Лёня Голубков в рекламе МММ - "а вы попробуйте" ;)
    Удачи!
     
  7. Drunkenmunky

    Drunkenmunky Активный пользователь

    С нами с:
    12 авг 2020
    Сообщения:
    1.484
    Симпатии:
    281
    Я что-то пропустил?
    Присвоение уже не работает?
    Или идея в том чтоб не как у всех?