Web

Как вставить новый элемент в массив в любую позицию на PHP

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

 

Ответ 1

Вы можете сделать это простым интуитивным способом. Для этого требуется только один вызов функции array_splice:

$original = array( 'a', 'b', 'c', 'd', 'e' );

$inserted = array( 'x' ); // не обязательно массив, см. руководство

array_splice( $original, 3, 0, $inserted ); // вставка в позициию+

3

// $original теперь a b c x d e

Если операция замена и для одного элемента, то нет необходимости помещать его в array(), если только этот элемент не является самим массивом, объектом или NULL.

 

Ответ 2

Функция, которая вставляет как целые, так и строковые позиции:

/**

 * @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',

  ),

)

 

Ответ 3

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

Я написал 2 метода, которые, как мне кажется, подходят для данного вопроса:

function insertBefore($input, $index, $element) {

    if (!array_key_exists($index, $input)) {

        throw new Exception("Index not found");

    }

    $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("Index not found");

    }

    $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("Index not found");

    }

    $tmpArray = array();

    foreach ($input as $key => $value) {

        if ($key === $index) {

            $tmpArray[$newKey] = $element;

        }

        $tmpArray[$key] = $value;

    }

    return $input;

}

 

function insertAfter($input, $index, $newKey, $element) {

    if (!array_key_exists($index, $input)) {

        throw new Exception("Index not found");

    }

    $tmpArray = array();

    foreach ($input as $key => $value) {

        $tmpArray[$key] = $value;

        if ($key === $index) {

            $tmpArray[$newKey] = $element;

        }

    }

    return $tmpArray;

}

 

Ответ 4

Вот что у меня сработало для ассоциативного массива:

/*

 * Вставляет новый ключ/значение после ключа в массиве.

 *

 * @param $key

 * Ключ, после которого нужно вставить значение.

 * @param $array

 * Массив для вставки.

 * @param $new_key

 * Ключ для вставки.

 * @param $new_value

 * Значение для вставки.

 *

 * @return

 * Новый массив, если ключ существует, FALSE в противном случае.

 *

 * @see array_insert_before()

 */

function array_insert_after($key, array &$array, $new_key, $new_value) {

  if (array_key_exists($key, $array)) {

    $new = array();

    foreach ($array as $k => $value) {

      $new[$k] = $value;

      if ($k === $key) {

        $new[$new_key] = $new_value;

      }

    }

    return $new;

  }

  return FALSE;

}

 

Ответ 5

Это тоже рабочее решение:

function array_insert(&$array,$element,$position=null) {

  if (count($array) == 0) {

    $array[] = $element;

  }

  elseif (is_numeric($position) && $position < 0) {

    if((count($array)+position) < 0) {

      $array = array_insert($array,$element,0);

    }

    else {

      $array[count($array)+$position] = $element;

    }

  }

  elseif (is_numeric($position) && isset($array[$position])) {

    $part1 = array_slice($array,0,$position,true);

    $part2 = array_slice($array,$position,null,true);

    $array = array_merge($part1,array($position=>$element),$part2);

    foreach($array as $key=>$item) {

      if (is_null($item)) {

        unset($array[$key]);

      }

    }

  }

  elseif (is_null($position)) {

    $array[] = $element;

  }  

  elseif (!isset($array[$position])) {

    $array[$position] = $element;

  }

  $array = array_merge($array);

  return $array;

}

 

Схожие статьи

Как и на чём лучше писать сайты?
Web

Как и на чём лучше писать сайты?

Django: уязвимости, от которых нужно защитить сайт в первую очередь
Web

Django: уязвимости, от которых нужно защитить сайт в первую очередь

Web

Как отловить ошибки cURL в PHP

Web

Принудительное использование SSL/https с помощью .htaccess и mod_rewrite

×