특정 위치에서 배열에 요소를 삽입하는 방법은 무엇입니까?


190

두 개의 배열이 있다고 상상해 봅시다.

$array_1 = array(
  '0' => 'zero',
  '1' => 'one',
  '2' => 'two',
  '3' => 'three',
);

$array_2 = array(
  'zero'  => '0',
  'one'   => '1',
  'two'   => '2',
  'three' => '3',
);

이제 array('sample_key' => 'sample_value')각 배열의 세 번째 요소 뒤에 삽입하고 싶습니다 . 내가 어떻게 해?


답변:


208

array_slice()를 사용하여 배열의 일부를 추출 할 수 있으며 공용체 배열 연산자 ( +) 는 해당 부분을 재결합 할 수 있습니다.

$res = array_slice($array, 0, 3, true) +
    array("my_key" => "my_value") +
    array_slice($array, 3, count($array)-3, true);

이 예는 :

$array = array(
  'zero'  => '0',
  'one'   => '1',
  'two'   => '2',
  'three' => '3',
);
$res = array_slice($array, 0, 3, true) +
    array("my_key" => "my_value") +
    array_slice($array, 3, count($array) - 1, true) ;
print_r($res);

제공합니다 :

정렬
(
    [제로] => 0
    [하나] => 1
    [2] => 2
    [my_key] => my_value
    [3] => 3
)

8
M42가 제안한대로 array_splice ()를 사용해야합니다. 한 줄의 코드로 문제를 해결합니다.
nickh

27
+사용해서는 안됩니다! array_merge대신 사용하십시오 ! 인덱스가 정수 (해시가 아닌 일반 배열) 인 +경우 예상대로 작동하지 않습니다 !!!
TMS

4
@Tomas 예상대로 작동하는지 여부는 예상에 따라 다릅니다. array_merge이 질문에는 숫자 키와 관련한 동작이 적합하지 않습니다.
Artefacto

10
사용하는 대신 count($array)-3단순히 동일한 효과에 null을 지정할 수 있습니다. 또한 array_mergeTMS가 제안한대로 사용하면 고유 인덱스를 사용할 필요가 없습니다. 예 : 기존 배열에 "새로운 값"을 추가하십시오.$b = array_merge( array_slice( $a, 0, 1, true ), array( 'new-value' ), array_slice( $a, 1, null, true ) );
Radley Sustaire

1
+vs. 에 대해 약간의 혼동이있는 것 같습니다 array_merge. 숫자 배열에 항목을 삽입 +하려면 예상과 일치하지 않기 때문에 사용해서는 안됩니다 . 그러나 array_merge어느 쪽도 사용해서는 안됩니다 . 숫자 배열의 경우이 전체 문제는 array_splice함수 로 해결됩니다 . 연관 배열 또는 혼합 배열의 경우 숫자 키를 다시 인덱싱하지 않으려 +는 경우를 사용하는 것이 전적으로 적합합니다.
meustrus

104

첫 번째 배열의 경우 다음을 사용하십시오 array_splice().

$array_1 = array(
  '0' => 'zero',
  '1' => 'one',
  '2' => 'two',
  '3' => 'three',
);

array_splice($array_1, 3, 0, 'more');
print_r($array_1);

산출:

Array(
    [0] => zero
    [1] => one
    [2] => two
    [3] => more
    [4] => three
)

두 번째 주문에는 주문이 없으므로 수행해야합니다.

$array_2['more'] = '2.5';
print_r($array_2);

원하는대로 키를 정렬하십시오.


33
두 번째 배열에는 순서가 있습니다 ... 모든 배열에는 이중 연결 목록이기 때문에 모든 배열이 있습니다.
Artefacto

5
-1, 언급 한대로 "순서가 없습니다"는 거짓입니다. 또한 array_splice는 첫 번째 예에서 키 / 값 연결을 삭제합니다 (그러나 OP가 의도 한 것).
Brad Koch

2
PHP의 @Artefacto "Arrays"는 사실 해시 테이블 입니다. PHP 배열은 배열처럼 작동하지만 실제로는 배열이 아닙니다. 또한 연결 목록 또는 배열 목록도 아닙니다.
Frederik Krautwald

1
5 시간 후 나는 마침내 내가 이해하는 답을 읽었습니다. 감사합니다! 누군가가 연관 배열을 푸시하는 경우 array_splice ..에서 네 번째 인수로 "array"를 지정할 수도 있습니다. array_splice ($ array_1, 3, 0, ARRAY ($ array_name_to_insert));
Robert Sinclair

1
@FrederikKrautwald PHP 7부터는 그 말이 사실이 아닙니다. PHP 7은 두 개의 배열을 사용하여 해시 테이블 + 순서 목록을 구현합니다. 다음은 핵심 PHP 개발자 (Nikic) 중 하나의 기사입니다. nikic.github.io/2014/12/22/…
CubicleSoft

19

암호:

function insertValueAtPosition($arr, $insertedArray, $position) {
    $i = 0;
    $new_array=[];
    foreach ($arr as $key => $value) {
        if ($i == $position) {
            foreach ($insertedArray as $ikey => $ivalue) {
                $new_array[$ikey] = $ivalue;
            }
        }
        $new_array[$key] = $value;
        $i++;
    }
    return $new_array;
}

예:

$array        = ["A"=8, "K"=>3];
$insert_array = ["D"= 9];

insertValueAtPosition($array, $insert_array, $position=2);
// result ====> ["A"=>8,  "D"=>9,  "K"=>3];

실제로 완벽하게 보이지는 않지만 작동합니다.


11
당신은 기본적으로 접합을 시도하고 있습니다. 바퀴를 재발 명하지 마십시오.
Paul Dragoonis

11
아니, 그는 바퀴를 재발 명하지 않습니다. array_splice ()는 키와 값을 넣을 수 없습니다. 특정 위치를 키로 사용하는 값만
Kirzilla

예, 그러나 앞에서 언급했듯이 array_splice는 연관 배열을 지원하지 않습니다. 더 우아한 접근법을보고 기뻐할 것입니다.
clausvdb

함수는 실제로는 좋지만 배열 길이보다 큰 위치에서는 제대로 작동하지 않습니다 (이 array_insert ($ array_2, array ( "wow"=> "wow"), 4) 실행). 그러나 쉽게 고칠 수 있습니다. 당신의 대답은 위대하고 내 질문에 대답했습니다!
Kirzilla

13

사용할 수있는 간단한 기능은 다음과 같습니다. 플러그 앤 플레이 만하면됩니다.

이것은 값이 아닌 색인으로 삽입입니다.

배열을 전달하거나 이미 선언 한 배열을 사용하도록 선택할 수 있습니다.

편집 : 짧은 버전 :

   function insert($array, $index, $val)
   {
       $size = count($array); //because I am going to use this more than one time
       if (!is_int($index) || $index < 0 || $index > $size)
       {
           return -1;
       }
       else
       {
           $temp   = array_slice($array, 0, $index);
           $temp[] = $val;
           return array_merge($temp, array_slice($array, $index, $size));
       }
   }

  function insert($array, $index, $val) { //function decleration
    $temp = array(); // this temp array will hold the value 
    $size = count($array); //because I am going to use this more than one time
    // Validation -- validate if index value is proper (you can omit this part)       
        if (!is_int($index) || $index < 0 || $index > $size) {
            echo "Error: Wrong index at Insert. Index: " . $index . " Current Size: " . $size;
            echo "<br/>";
            return false;
        }    
    //here is the actual insertion code
    //slice part of the array from 0 to insertion index
    $temp = array_slice($array, 0, $index);//e.g index=5, then slice will result elements [0-4]
    //add the value at the end of the temp array// at the insertion index e.g 5
    array_push($temp, $val);
    //reconnect the remaining part of the array to the current temp
    $temp = array_merge($temp, array_slice($array, $index, $size)); 
    $array = $temp;//swap// no need for this if you pass the array cuz you can simply return $temp, but, if u r using a class array for example, this is useful. 

     return $array; // you can return $temp instead if you don't use class array
}

이제 다음을 사용하여 코드를 테스트 할 수 있습니다.

//1
$result = insert(array(1,2,3,4,5),0, 0);
echo "<pre>";
echo "<br/>";
print_r($result);
echo "</pre>";
//2
$result = insert(array(1,2,3,4,5),2, "a");
echo "<pre>";
print_r($result);
echo "</pre>";
//3
$result = insert(array(1,2,3,4,5) ,4, "b");
echo "<pre>";
print_r($result);
echo "</pre>";
//4
$result = insert(array(1,2,3,4,5),5, 6);
echo "<pre>";
echo "<br/>";
print_r($result);
echo "</pre>";

결과는 다음과 같습니다.

//1
Array
(
    [0] => 0
    [1] => 1
    [2] => 2
    [3] => 3
    [4] => 4
    [5] => 5
)
//2
Array
(
    [0] => 1
    [1] => 2
    [2] => a
    [3] => 3
    [4] => 4
    [5] => 5
)
//3
Array
(
    [0] => 1
    [1] => 2
    [2] => 3
    [3] => 4
    [4] => b
    [5] => 5
)

//4
Array
(
    [0] => 1
    [1] => 2
    [2] => 3
    [3] => 4
    [4] => 5
    [5] => 6
)

12
$list = array(
'Tunisia' => 'Tunis',
'Germany' => 'Berlin',
'Italy' => 'Rom',
'Egypt' => 'Cairo'
);
$afterIndex = 2;
$newVal= array('Palestine' => 'Jerusalem');

$newList = array_merge(array_slice($list,0,$afterIndex+1), $newVal,array_slice($list,$afterIndex+1));

간단히
말해

@roelleor하지만주의해야합니다. "입력 배열에 동일한 문자열 키가있는 경우 해당 키의 이후 값이 이전 키를 덮어 씁니다. 그러나 배열에 숫자 키가 포함되어 있으면 이후 값이 원래 값을 덮어 쓰지 않습니다. "추가됩니다." - array_merge

5

이 기능은 다음을 지원합니다.

  • 숫자 및 연관 키 모두
  • 설립 된 키 이전 또는 이후에 삽입
  • 키를 찾지 못하면 배열 끝에 추가

function insert_into_array( $array, $search_key, $insert_key, $insert_value, $insert_after_founded_key = true, $append_if_not_found = false ) {

        $new_array = array();

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

            // INSERT BEFORE THE CURRENT KEY? 
            // ONLY IF CURRENT KEY IS THE KEY WE ARE SEARCHING FOR, AND WE WANT TO INSERT BEFORE THAT FOUNDED KEY
            if( $key === $search_key && ! $insert_after_founded_key )
                $new_array[ $insert_key ] = $insert_value;

            // COPY THE CURRENT KEY/VALUE FROM OLD ARRAY TO A NEW ARRAY
            $new_array[ $key ] = $value;

            // INSERT AFTER THE CURRENT KEY? 
            // ONLY IF CURRENT KEY IS THE KEY WE ARE SEARCHING FOR, AND WE WANT TO INSERT AFTER THAT FOUNDED KEY
            if( $key === $search_key && $insert_after_founded_key )
                $new_array[ $insert_key ] = $insert_value;

        }

        // APPEND IF KEY ISNT FOUNDED
        if( $append_if_not_found && count( $array ) == count( $new_array ) )
            $new_array[ $insert_key ] = $insert_value;

        return $new_array;

    }

용법:

    $array1 = array(
        0 => 'zero',
        1 => 'one',
        2 => 'two',
        3 => 'three',
        4 => 'four'
    );

    $array2 = array(
        'zero'  => '# 0',
        'one'   => '# 1',
        'two'   => '# 2',
        'three' => '# 3',
        'four'  => '# 4'
    );

    $array3 = array(
        0 => 'zero',
        1 => 'one',
       64 => '64',
        3 => 'three',
        4 => 'four'
    );


    // INSERT AFTER WITH NUMERIC KEYS
    print_r( insert_into_array( $array1, 3, 'three+', 'three+ value') );

    // INSERT AFTER WITH ASSOC KEYS
    print_r( insert_into_array( $array2, 'three', 'three+', 'three+ value') );

    // INSERT BEFORE
    print_r( insert_into_array( $array3, 64, 'before-64', 'before-64 value', false) );

    // APPEND IF SEARCH KEY ISNT FOUNDED
    print_r( insert_into_array( $array3, 'undefined assoc key', 'new key', 'new value', true, true) );

결과 :

Array
(
    [0] => zero
    [1] => one
    [2] => two
    [3] => three
    [three+] => three+ value
    [4] => four
)
Array
(
    [zero] => # 0
    [one] => # 1
    [two] => # 2
    [three] => # 3
    [three+] => three+ value
    [four] => # 4
)
Array
(
    [0] => zero
    [1] => one
    [before-64] => before-64 value
    [64] => 64
    [3] => three
    [4] => four
)
Array
(
    [0] => zero
    [1] => one
    [64] => 64
    [3] => three
    [4] => four
    [new key] => new value
)

4

나는 최근에 당신이 시도하는 것처럼 들리는 것과 비슷한 것을하는 함수를 작성했습니다. 이것은 clasvdb의 대답에 대한 비슷한 접근법입니다.

function magic_insert($index,$value,$input_array ) {
  if (isset($input_array[$index])) {
    $output_array = array($index=>$value);
    foreach($input_array as $k=>$v) {
      if ($k<$index) {
        $output_array[$k] = $v;
      } else {
        if (isset($output_array[$k]) ) {
          $output_array[$k+1] = $v;
        } else {
          $output_array[$k] = $v;
        }
      } 
    }

  } else {
    $output_array = $input_array;
    $output_array[$index] = $value;
  }
  ksort($output_array);
  return $output_array;
}

기본적으로 특정 지점에 삽입되지만 모든 항목을 아래로 이동하여 덮어 쓰지는 않습니다.


이 magic_insert (3, array ( "wow"=> "wow"), $ array_2); 질문 텍스트에서 $ array_2를 가져옵니다.
Kirzilla

나는 $ array_2가 연관적이고 위치 개념이 일반적으로 그러한 상황과 관련이 없기 때문에 효과가 있다고는 기대하지 않습니다.
Peter O'Callaghan

4

당신이하지 않으면 알고 당신이 위치 # 3에 삽입 할 것인지, 그러나 당신이 알고있는 는 이후에 삽입 할 것인지를, 나는이 질문을보고 난 후에이 작은 기능을 요리.

/**
     * Inserts any number of scalars or arrays at the point
     * in the haystack immediately after the search key ($needle) was found,
     * or at the end if the needle is not found or not supplied.
     * Modifies $haystack in place.
     * @param array &$haystack the associative array to search. This will be modified by the function
     * @param string $needle the key to search for
     * @param mixed $stuff one or more arrays or scalars to be inserted into $haystack
     * @return int the index at which $needle was found
     */                         
    function array_insert_after(&$haystack, $needle = '', $stuff){
        if (! is_array($haystack) ) return $haystack;

        $new_array = array();
        for ($i = 2; $i < func_num_args(); ++$i){
            $arg = func_get_arg($i);
            if (is_array($arg)) $new_array = array_merge($new_array, $arg);
            else $new_array[] = $arg;
        }

        $i = 0;
        foreach($haystack as $key => $value){
            ++$i;
            if ($key == $needle) break;
        }

        $haystack = array_merge(array_slice($haystack, 0, $i, true), $new_array, array_slice($haystack, $i, null, true));

        return $i;
    }

작동하는 코드 패드 바이올린은 다음과 같습니다. http://codepad.org/5WlKFKfz

참고 : array_splice ()는 array_merge (array_slice ())보다 훨씬 효율적이지만 삽입 된 배열의 키는 손실되었습니다. 한숨.


3

보다 깔끔한 접근 방식 (유동성 및 적은 코드 기준)

/**
 * Insert data at position given the target key.
 *
 * @param array $array
 * @param mixed $target_key
 * @param mixed $insert_key
 * @param mixed $insert_val
 * @param bool $insert_after
 * @param bool $append_on_fail
 * @param array $out
 * @return array
 */
function array_insert(
    array $array, 
    $target_key, 
    $insert_key, 
    $insert_val = null,
    $insert_after = true,
    $append_on_fail = false,
    $out = [])
{
    foreach ($array as $key => $value) {
        if ($insert_after) $out[$key] = $value;
        if ($key == $target_key) $out[$insert_key] = $insert_val;
        if (!$insert_after) $out[$key] = $value;
    }

    if (!isset($array[$target_key]) && $append_on_fail) {
        $out[$insert_key] = $insert_val;
    }

    return $out;
}

용법:

$colors = [
    'blue' => 'Blue',
    'green' => 'Green',
    'orange' => 'Orange',
];

$colors = array_insert($colors, 'blue', 'pink', 'Pink');

die(var_dump($colors));

2

특정 키 뒤에 (요소 또는 배열)을 삽입하려는 경우 가장 간단한 해결책 :

function array_splice_after_key($array, $key, $array_to_insert)
{
    $key_pos = array_search($key, array_keys($array));
    if($key_pos !== false){
        $key_pos++;
        $second_array = array_splice($array, $key_pos);
        $array = array_merge($array, $array_to_insert, $second_array);
    }
    return $array;
}

따라서 다음이있는 경우 :

$array = [
    'one' => 1,
    'three' => 3
];
$array_to_insert = ['two' => 2];

그리고 다음을 실행하십시오.

$result_array = array_splice_after_key($array, 'one', $array_to_insert);

당신은 할 것이다 :

Array ( 
    ['one'] => 1 
    ['two'] => 2 
    ['three'] => 3 
)

2

array_slice 대신 array_splice를 사용하면 함수 호출이 줄어 듭니다.

$toto =  array(
  'zero'  => '0',
  'one'   => '1',
  'two'   => '2',
  'three' => '3'
);
$ret = array_splice($toto, 3 );
$toto = $toto +  array("my_key" => "my_value") + $ret;
print_r($toto);

2

나는 그렇게


    $slightly_damaged = array_merge(
        array_slice($slightly_damaged, 0, 4, true) + ["4" => "0.0"], 
        array_slice($slightly_damaged, 4, count($slightly_damaged) - 4, true)
    );

형식 코드 pls는 편집 메뉴 <3
RaisingAgent

1

방금 숫자 인덱스에 매우 쉬운 ArrayHelper 클래스를 만들었습니다.

class ArrayHelper
{
    /*
        Inserts a value at the given position or throws an exception if
        the position is out of range.
        This function will push the current values up in index. ex. if 
        you insert at index 1 then the previous value at index 1 will 
        be pushed to index 2 and so on.
        $pos: The position where the inserted value should be placed. 
        Starts at 0.
    */
    public static function insertValueAtPos(array &$array, $pos, $value) {
        $maxIndex = count($array)-1;

        if ($pos === 0) {
            array_unshift($array, $value);
        } elseif (($pos > 0) && ($pos <= $maxIndex)) {
            $firstHalf = array_slice($array, 0, $pos);
            $secondHalf = array_slice($array, $pos);
            $array = array_merge($firstHalf, array($value), $secondHalf);
        } else {
            throw new IndexOutOfBoundsException();
        }

    }
}

예:

$array = array('a', 'b', 'c', 'd', 'e');
$insertValue = 'insert';
\ArrayHelper::insertValueAtPos($array, 3, $insertValue);

$ 배열 시작 :

Array ( 
    [0] => a 
    [1] => b 
    [2] => c 
    [3] => d 
    [4] => e 
)

결과:

Array ( 
    [0] => a 
    [1] => b 
    [2] => c 
    [3] => insert 
    [4] => d 
    [5] => e 
)

1

이것은 어떤 위치에 항목을 배열에 삽입하는 더 나은 방법입니다.

function arrayInsert($array, $item, $position)
{
    $begin = array_slice($array, 0, $position);
    array_push($begin, $item);
    $end = array_slice($array, $position);
    $resultArray = array_merge($begin, $end);
    return $resultArray;
}

1

열쇠를 끼우기 전에, 교체하기 전에 삽입을 할 수있는 무언가가 필요했습니다. 대상 키가 없으면 배열의 시작 또는 끝에 추가하십시오. 기본값은 키 다음에 삽입하는 것입니다.

새로운 기능

/**
 * Insert element into an array at a specific key.
 *
 * @param array $input_array
 *   The original array.
 * @param array $insert
 *   The element that is getting inserted; array(key => value).
 * @param string $target_key
 *   The key name.
 * @param int $location
 *   1 is after, 0 is replace, -1 is before.
 *
 * @return array
 *   The new array with the element merged in.
 */
function insert_into_array_at_key(array $input_array, array $insert, $target_key, $location = 1) {
  $output = array();
  $new_value = reset($insert);
  $new_key = key($insert);
  foreach ($input_array as $key => $value) {
    if ($key === $target_key) {
      // Insert before.
      if ($location == -1) {
        $output[$new_key] = $new_value;
        $output[$key] = $value;
      }
      // Replace.
      if ($location == 0) {
        $output[$new_key] = $new_value;
      }
      // After.
      if ($location == 1) {
        $output[$key] = $value;
        $output[$new_key] = $new_value;
      }
    }
    else {
      // Pick next key if there is an number collision.
      if (is_numeric($key)) {
        while (isset($output[$key])) {
          $key++;
        }
      }
      $output[$key] = $value;
    }
  }
  // Add to array if not found.
  if (!isset($output[$new_key])) {
    // Before everything.
    if ($location == -1) {
      $output = $insert + $output;
    }
    // After everything.
    if ($location == 1) {
      $output[$new_key] = $new_value;
    }

  }
  return $output;
}

입력 코드

$array_1 = array(
  '0' => 'zero',
  '1' => 'one',
  '2' => 'two',
  '3' => 'three',
);
$array_2 = array(
  'zero'  => '0',
  'one'   => '1',
  'two'   => '2',
  'three' => '3',
);

$array_1 = insert_into_array_at_key($array_1, array('sample_key' => 'sample_value'), 2, 1);
print_r($array_1);
$array_2 = insert_into_array_at_key($array_2, array('sample_key' => 'sample_value'), 'two', 1);
print_r($array_2);

산출

Array
(
    [0] => zero
    [1] => one
    [2] => two
    [sample_key] => sample_value
    [3] => three
)
Array
(
    [zero] => 0
    [one] => 1
    [two] => 2
    [sample_key] => sample_value
    [three] => 3
)

1

귀하의 질문에 매우 간단한 2 문자열 답변 :

$array_1 = array(
  '0' => 'zero',
  '1' => 'one',
  '2' => 'two',
  '3' => 'three',
);

먼저 array_splice를 사용하여 세 번째 요소에 무엇이든 삽입 한 다음이 요소에 값을 지정하십시오.

array_splice($array_1, 3, 0 , true);
$array_1[3] = array('sample_key' => 'sample_value');

1

이것은 오래된 질문이지만 2014 년에 의견을 게시하고 자주 다시 돌아옵니다. 나는 완전한 답을 남기겠다고 생각했다. 이것은 가장 짧은 해결책은 아니지만 이해하기 쉽습니다.

번호가 매겨진 위치, 키 보존 및 보존 순서로 연관 배열에 새 값을 삽입하십시오.

$columns = array(
    'id' => 'ID',
    'name' => 'Name',
    'email' => 'Email',
    'count' => 'Number of posts'
);

$columns = array_merge(
    array_slice( $columns, 0, 3, true ),     // The first 3 items from the old array
    array( 'subscribed' => 'Subscribed' ),   // New value to add after the 3rd item
    array_slice( $columns, 3, null, true )   // Other items after the 3rd
);

print_r( $columns );

/*
Array ( 
    [id] => ID 
    [name] => Name 
    [email] => Email 
    [subscribed] => Subscribed 
    [count] => Number of posts 
)
*/

0

Artefacto의 답변만큼 구체적이지는 않지만 array_slice () 사용에 대한 제안을 바탕으로 다음 함수를 작성했습니다.

function arrayInsert($target, $byKey, $byOffset, $valuesToInsert, $afterKey) {
    if (isset($byKey)) {
        if (is_numeric($byKey)) $byKey = (int)floor($byKey);
        $offset = 0;

        foreach ($target as $key => $value) {
            if ($key === $byKey) break;
            $offset++;
        }

        if ($afterKey) $offset++;
    } else {
        $offset = $byOffset;
    }

    $targetLength = count($target);
    $targetA = array_slice($target, 0, $offset, true);
    $targetB = array_slice($target, $offset, $targetLength, true);
    return array_merge($targetA, $valuesToInsert, $targetB);
}

풍모:

  • 하나 또는 여러 개의 값 삽입
  • 키 값 쌍 삽입
  • 키 전 / 후 또는 오프셋으로 삽입

사용 예 :

$target = [
    'banana' => 12,
    'potatoe' => 6,
    'watermelon' => 8,
    'apple' => 7,
    2 => 21,
    'pear' => 6
];

// Values must be nested in an array
$insertValues = [
    'orange' => 0,
    'lemon' => 3,
    3
];

// By key
// Third parameter is not applicable
//     Insert after 2 (before 'pear')
var_dump(arrayInsert($target, 2, null, $valuesToInsert, true));
//     Insert before 'watermelon'
var_dump(arrayInsert($target, 'watermelon', null, $valuesToInsert, false)); 

// By offset
// Second and last parameter are not applicable
//     Insert in position 2 (zero based i.e. before 'watermelon')
var_dump(arrayInsert($target, null, 2, $valuesToInsert, null)); 

0

@clausvdb 응답을 기반으로 특정 위치의 배열에 항목을 삽입하려는 경우 :

function array_insert($arr, $insert, $position) {
    $i = 0;
    $ret = array();
    foreach ($arr as $key => $value) {
            if ($i == $position) {
                $ret[] = $insert;
            }
            $ret[] = $value;
            $i++;
    }
    return $ret;
}

0

내 버전은 다음과 같습니다.

/**
 * 
 * Insert an element after an index in an array
 * @param array $array  
 * @param string|int $key 
 * @param mixed $value
 * @param string|int $offset
 * @return mixed
 */
function array_splice_associative($array, $key, $value, $offset) {
    if (!is_array($array)) {
        return $array;
    }
    if (array_key_exists($key, $array)) {
        unset($array[$key]);
    }
    $return = array();
    $inserted = false;
    foreach ($array as $k => $v) {
        $return[$k] = $v;
        if ($k == $offset && !$inserted) {
            $return[$key] = $value;
            $inserted = true;
        }
    }
    if (!$inserted) {
        $return[$key] = $value;
    }


    return $return;
}

0

쉬운 방법 .. 사용 array_splice()

$array_1 = array(
  '0' => 'zero',
  '1' => 'one',
  '2' => 'two',
  '3' => 'three',
);

$addArray = array('sample_key' => 'sample_value');

array_splice($rs, 3, 0, $addArray);

결과..

Array
(
    [0] => zero
    [1] => one
    [2] => two
    [3] => sample_value
    [4] => three
)

2
이것은 다른 모든 의견과 답변에 아무것도 추가하지 않습니다
j08691

0

이것은 또 다른 해결책입니다. PHP 7.1


     /**
     * @param array $input    Input array to add items to
     * @param array $items    Items to insert (as an array)
     * @param int   $position Position to inject items from (starts from 0)
     *
     * @return array
     */
    function arrayInject( array $input, array $items, int $position ): array 
    {
        if (0 >= $position) {
            return array_merge($items, $input);
        }
        if ($position >= count($input)) {
            return array_merge($input, $items);
        }

        return array_merge(
            array_slice($input, 0, $position, true),
            $items,
            array_slice($input, $position, null, true)
        );
    }

-1

이 루프 는 원래 배열 의 복사본 에서 작동하기 때문에 foreach 루프 중에 요소를 삽입 할 수 있지만 삽입 된 줄 수를 추적해야합니다 (이 코드에서는이 "부풀림"이라고합니다).

$bloat=0;
foreach ($Lines as $n=>$Line)
    {
    if (MustInsertLineHere($Line))
        {
        array_splice($Lines,$n+$bloat,0,"string to insert");
        ++$bloat;
        }
    }

분명히,이 "팽창"아이디어를 일반화하여 foreach 루프 동안 임의의 삽입 및 삭제를 처리 할 수 ​​있습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.