6

Вставка нового элемента в массив в любом месте в PHP

4

Как вставить новый элемент в массив в любом месте, например, в середине массива?

Я столкнулся с проблемой вставки нового элемента в массив в произвольной позиции, например, в середину массива. Есть ли способ сделать это на языке программирования, который я использую? Я хотел бы узнать, как правильно организовать процесс вставки, чтобы не потерять существующие элементы массива. Буду признателен за любые советы или примеры кода!

5 ответ(ов)

0

Для выполнения вставки элемента в массив как по числовым, так и по строковым позициям в PHP вы можете использовать следующую функцию array_insert:

/**
 * @param array      $array
 * @param int|string $position
 * @param mixed      $insert
 */
function array_insert(&$array, $position, $insert)
{
    if (is_int($position)) {
        array_splice($array, $position, 0, $insert);
    } else {
        $pos   = array_search($position, array_keys($array));
        $array = array_merge(
            array_slice($array, 0, $pos),
            $insert,
            array_slice($array, $pos)
        );
    }
}

Пример использования для числовых позиций:

$arr = ["one", "two", "three"];
array_insert(
    $arr,
    1,
    "one-half"
);
// Результат:
// array (
//   0 => 'one',
//   1 => 'one-half',
//   2 => 'two',
//   3 => 'three',
// )

Пример использования для строковых позиций:

$arr = [
    "name"  => [
        "type"      => "string",
        "maxlength" => "30",
    ],
    "email" => [
        "type"      => "email",
        "maxlength" => "150",
    ],
];

array_insert(
    $arr,
    "email",
    [
        "phone" => [
            "type"   => "string",
            "format" => "phone",
        ],
    ]
);
// Результат:
// array (
//   'name' =>
//   array (
//     'type' => 'string',
//     'maxlength' => '30',
//   ),
//   'phone' =>
//   array (
//     'type' => 'string',
//     'format' => 'phone',
//   ),
//   'email' =>
//   array (
//     'type' => 'email',
//     'maxlength' => '150',
//   ),
// )

Функция array_insert позволяет вам вставлять элементы в массивы как по индексам, так и по ключам, благодаря чему вы можете гибко управлять содержимым ваших массивов.

0

Для того чтобы объединить массивы и вставить значение в нужное место, вы можете использовать функцию array_merge в сочетании с array_slice, как это показано в вашем примере. В данном случае мы берем первые два элемента из массива $a, добавляем значение 5, а затем соединяем это с оставшимися элементами массива $a.

Вот пошаговое объяснение:

  1. array_slice($a, 0, 2) берет первые два элемента массива $a, в результате получаем массив [1, 2].
  2. Мы явно создаем массив с элементом [5].
  3. array_slice($a, 2) берет все элементы массива $a, начиная с индекса 2, что дает [3, 4].

Затем мы объединяем эти части с помощью array_merge:

$a = array(1, 2, 3, 4);
$b = array_merge(array_slice($a, 0, 2), array(5), array_slice($a, 2));
// $b будет равно array(1, 2, 5, 3, 4);

В результате массив $b станет [1, 2, 5, 3, 4], как вы и планировали.

0

Если вы хотите сохранить ключи исходного массива и одновременно добавить массив, который также имеет ключи, используйте следующую функцию:

function insertArrayAtPosition( $array, $insert, $position ) {
    /*
    $array : Исходный массив, который я хочу изменить
    $insert : Новый массив, который я хочу добавить, например array('key' => 'value') или array('value')
    $position : Позиция, куда будет вставлен новый массив. Обратите внимание, что индексация массивов начинается с 0
    */
    return array_slice($array, 0, $position, TRUE) + $insert + array_slice($array, $position, NULL, TRUE);
}

Пример вызова:

$array = insertArrayAtPosition($array, array('key' => 'Value'), 3);

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

0

Вы можете вставлять элементы в массив следующим образом:

function array_insert(&$array, $value, $index)
{
    return $array = array_merge(array_splice($array, max(0, $index - 1)), array($value), $array);
}

Эта функция array_insert принимает три параметра: массив по ссылке, значение, которое вы хотите вставить, и индекс, по которому вы хотите вставить это значение. Сначала она использует array_splice для разделения массива на две части: элементы до указанного индекса и элементы после. Затем с помощью array_merge объединяет обе части массива с добавленным значением. Учтите, что индексы начинаются с 0, и если индекс меньше 0, будет вставлено в начало массива.

0

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

Тем не менее, я написал два метода, которые, как мне кажется, подходят для этой задачи:

function insertBefore($input, $index, $element) {
    if (!array_key_exists($index, $input)) {
        throw new Exception("Индекс не найден");
    }
    $tmpArray = array();
    $originalIndex = 0;
    foreach ($input as $key => $value) {
        if ($key === $index) {
            $tmpArray[] = $element;
            break;
        }
        $tmpArray[$key] = $value;
        $originalIndex++;
    }
    array_splice($input, 0, $originalIndex, $tmpArray);
    return $input;
}

function insertAfter($input, $index, $element) {
    if (!array_key_exists($index, $input)) {
        throw new Exception("Индекс не найден");
    }
    $tmpArray = array();
    $originalIndex = 0;
    foreach ($input as $key => $value) {
        $tmpArray[$key] = $value;
        $originalIndex++;
        if ($key === $index) {
            $tmpArray[] = $element;
            break;
        }
    }
    array_splice($input, 0, $originalIndex, $tmpArray);
    return $input;
}

Хотя эти функции работают быстрее и, вероятно, более экономичны с точки зрения памяти, они подходят только в тех случаях, когда не требуется сохранять ключи массива.

Если же вам нужно сохранить ключи, то лучше использовать следующие функции:

function insertBefore($input, $index, $newKey, $element) {
    if (!array_key_exists($index, $input)) {
        throw new Exception("Индекс не найден");
    }
    $tmpArray = array();
    foreach ($input as $key => $value) {
        if ($key === $index) {
            $tmpArray[$newKey] = $element;
        }
        $tmpArray[$key] = $value;
    }
    return $tmpArray;
}

function insertAfter($input, $index, $newKey, $element) {
    if (!array_key_exists($index, $input)) {
        throw new Exception("Индекс не найден");
    }
    $tmpArray = array();
    foreach ($input as $key => $value) {
        $tmpArray[$key] = $value;
        if ($key === $index) {
            $tmpArray[$newKey] = $element;
        }
    }
    return $tmpArray;
}

Эти функции позволяют вставлять элементы перед или после указанного индекса, сохраняя при этом ключи массива.

Чтобы ответить на вопрос, пожалуйста, войдите или зарегистрируйтесь