PHP의 어느 위치에서나 배열에 새 항목 삽입


답변:


919

좀 더 직관적 인 것을 알 수 있습니다. 하나의 함수 호출 만 필요합니다 array_splice.

$original = array( 'a', 'b', 'c', 'd', 'e' );
$inserted = array( 'x' ); // not necessarily an array, see manual quote

array_splice( $original, 3, 0, $inserted ); // splice in at position 3
// $original is now a b c x d e

대체가 단지 하나의 요소 인 경우 요소가 배열 자체, 객체 또는 NULL이 아닌 경우 array ()를 넣을 필요는 없습니다.


32
문서에 설명 된이 기능의 주요 목적이 다른 것 (배열의 내용 바꾸기)이라는 기본 기능이 실제로 숨겨져있는 것이 이상합니다. 그렇습니다. 인수 섹션에서 지적되었지만 배열에 삽입하는 데 사용할 기능을 찾기 위해 함수 설명을 스캔하는 경우 결코 찾지 못했습니다.
Mahn

23
이것이 $inserted배열의 키를 보존하지 않는다고 말하는 것 입니다.
mauris


3
@JacerOmri 그것은 완전히 옳습니다. 두 진술 모두 유효합니다. 모든 유형의 값을 전달할 수 있지만 배열, 객체 또는 null에 대해 동일하게 작동하지 않을 수 있습니다. 스칼라의 경우 타입 캐스팅은와 (array)$scalar동일 array($scalar)하지만 배열, 객체 또는 null의 경우 무시되거나 (배열), 배열 (개체)로 변환되거나 빈 배열이됩니다 (null) -php.net
Lukas

2
@SunilPachlangia, adelval 및 기타 : 다차원 배열을 사용하면 대체물을 배열로 감싸 야하며 문서화되어 있습니다. 나는 사람들이 실수를 저 지르지 않도록 여전히 여기에 메모를 가져 왔습니다.
Félix Gagnon-Grenier

47

정수와 문자열 위치 모두에 삽입 할 수있는 함수 :

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

1
array_splice()반면, 키를 상실 array_merge()하지 않습니다. 따라서 첫 번째 함수의 결과는 매우 놀랍습니다 ... 특히 같은 키를 가진 두 개의 요소가있는 경우 마지막 요소의 값만 유지되므로 ...
Alexis Wilke

33
$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)

10
사용 +대신 array_merge키를 보존 할 수 있습니다
mauris

1
이제 INDEX 이전에 더 많은 요소를 추가 할 수 있습니다
Abbas

5

이런 식으로 배열을 삽입 할 수 있습니다.

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

2
이 함수는 순서를 배열로 저장하지 않습니다.
Daniel Petrovaliev

5

요청한 것을 정확하게 수행 할 수있는 기본 PHP 함수는 없습니다.

목적에 적합하다고 생각되는 두 가지 방법을 작성했습니다.

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;
}

1
이것은 잘 작동합니다. 그러나 두 번째 예에서는 함수 insertBefore()에서 $tmpArray대신을 반환해야합니다 $input.
Christoph Fischer

4

@Halil 위대한 대답을 바탕으로 정수 키를 유지하면서 특정 키 뒤에 새 요소를 삽입하는 방법은 다음과 같습니다.

private function arrayInsertAfterKey($array, $afterKey, $key, $value){
    $pos   = array_search($afterKey, array_keys($array));

    return array_merge(
        array_slice($array, 0, $pos, $preserve_keys = true),
        array($key=>$value),
        array_slice($array, $pos, $preserve_keys = true)
    );
} 

4

초기 배열의 키를 유지하고 키가있는 배열을 추가하려면 아래 기능을 사용하십시오.

function insertArrayAtPosition( $array, $insert, $position ) {
    /*
    $array : The initial array i want to modify
    $insert : the new array i want to add, eg array('key' => 'value') or array('value')
    $position : the position where the new array will be inserted into. Please mind that arrays start at 0
    */
    return array_slice($array, 0, $position, TRUE) + $insert + array_slice($array, $position, NULL, TRUE);
}

전화 예 :

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

3
function insert(&$arr, $value, $index){       
    $lengh = count($arr);
    if($index<0||$index>$lengh)
        return;

    for($i=$lengh; $i>$index; $i--){
        $arr[$i] = $arr[$i-1];
    }

    $arr[$index] = $value;
}

3

이것이 연관 배열에서 나를 위해 일한 것입니다.

/*
 * Inserts a new key/value after the key in the array.
 *
 * @param $key
 *   The key to insert after.
 * @param $array
 *   An array to insert in to.
 * @param $new_key
 *   The key to insert.
 * @param $new_value
 *   An value to insert.
 *
 * @return
 *   The new array if the key exists, FALSE otherwise.
 *
 * @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;
}

함수 소스- 이 블로그 게시물 . BEFORE 특정 키를 삽입하는 편리한 기능도 있습니다.


2

이것은 또한 작동하는 솔루션입니다.

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;
}

크레딧은 http://binarykitten.com/php/52-php-insert-element-and-shift.html 로 이동하십시오.


2

jay.lee의 솔루션은 완벽합니다. 다차원 배열에 항목을 추가하려면 먼저 1 차원 배열을 추가 한 다음 교체하십시오.

$original = (
[0] => Array
    (
        [title] => Speed
        [width] => 14
    )

[1] => Array
    (
        [title] => Date
        [width] => 18
    )

[2] => Array
    (
        [title] => Pineapple
        [width] => 30
     )
)

이 배열에 같은 형식의 항목을 추가하면 모든 새 배열 색인이 항목이 아닌 항목으로 추가됩니다.

$new = array(
    'title' => 'Time',
    'width' => 10
);
array_splice($original,1,0,array('random_string')); // can be more items
$original[1] = $new;  // replaced with actual item

참고 : array_splice 를 사용하여 다차원 배열에 항목을 직접 추가하면 해당 항목 대신 모든 색인이 항목으로 추가됩니다.


2

이것을 사용할 수 있습니다

foreach ($array as $key => $value) 
{
    if($key==1)
    {
        $new_array[]=$other_array;
    }   
    $new_array[]=$value;    
}

1

일반적으로 스칼라 값으로 :

$elements = array('foo', ...);
array_splice($array, $position, $length, $elements);

단일 배열 요소를 배열에 삽입하려면 배열을 스칼라 값으로 배열로 래핑하는 것을 잊지 마십시오.

$element = array('key1'=>'value1');
$elements = array($element);
array_splice($array, $position, $length, $elements);

그렇지 않으면 배열의 모든 키가 하나씩 추가됩니다.


1

배열의 시작 부분에 요소를 추가하기위한 힌트 :

$a = array('first', 'second');
$a[-1] = 'i am the new first element';

그때:

foreach($a as $aelem)
    echo $a . ' ';
//returns first, second, i am...

그러나:

for ($i = -1; $i < count($a)-1; $i++)
     echo $a . ' ';
//returns i am as 1st element

13
처음에 요소를 추가하기위한 힌트 :array_unshift($a,'i am the new first element');

1

확실하지 않은 경우 다음을 사용하지 마십시오 .

$arr1 = $arr1 + $arr2;

또는

$arr1 += $arr2;

때문에와 + 원래 배열 덮어 쓰게된다. ( 출처 참조 )


1

이거 한번 해봐:

$colors = array('red', 'blue', 'yellow');

$colors = insertElementToArray($colors, 'green', 2);


function insertElementToArray($arr = array(), $element = null, $index = 0)
{
    if ($element == null) {
        return $arr;
    }

    $arrLength = count($arr);
    $j = $arrLength - 1;

    while ($j >= $index) {
        $arr[$j+1] = $arr[$j];
        $j--;
    }

    $arr[$index] = $element;

    return $arr;
}

1
function array_insert($array, $position, $insert) {
    if ($position > 0) {
        if ($position == 1) {
            array_unshift($array, array());
        } else {
            $position = $position - 1;
            array_splice($array, $position, 0, array(
                ''
            ));
        }
        $array[$position] = $insert;
    }

    return $array;
}

전화 예 :

$array = array_insert($array, 1, ['123', 'abc']);

0

문자열 키를 사용하여 배열에 요소를 삽입하려면 다음과 같이 할 수 있습니다.

/* insert an element after given array key
 * $src = array()  array to work with
 * $ins = array() to insert in key=>array format
 * $pos = key that $ins will be inserted after
 */ 
function array_insert_string_keys($src,$ins,$pos) {

    $counter=1;
    foreach($src as $key=>$s){
        if($key==$pos){
            break;
        }
        $counter++;
    } 

    $array_head = array_slice($src,0,$counter);
    $array_tail = array_slice($src,$counter);

    $src = array_merge($array_head, $ins);
    $src = array_merge($src, $array_tail);

    return($src); 
} 

2
왜 안돼 $src = array_merge($array_head, $ins, $array_tail);?
cartbeforehorse 16:30에
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.