PHP में किसी भी स्थिति पर सरणी में नया आइटम डालें


जवाबों:


916

आपको यह थोड़ा अधिक सहज लग सकता है। इसके लिए केवल एक फ़ंक्शन कॉल की आवश्यकता है 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।


32
यह अजीब है कि इस तरह की बुनियादी कार्यक्षमता वास्तव में छिपी हुई है, जिसमें इस फ़ंक्शन का मुख्य उद्देश्य जैसा कि प्रलेखन में वर्णित है, कुछ अलग है (सरणियों में सामान को प्रतिस्थापित करें)। हां, यह तर्क अनुभाग में बताया गया है, लेकिन यदि आप केवल फ़ंक्शन विवरणों को स्कैन करने के लिए यह पता लगाने के लिए कि क्या एरे में सम्मिलित करने के लिए उपयोग करें, तो आप इसे कभी नहीं पाएंगे।
महन

23
केवल यह कहते हुए कि यह $insertedसरणी में कुंजियों को संरक्षित नहीं करेगा ।
मौरिस

6
PHP मैनुअल में भी, उदाहरण # 1: php.net/manual/en/function.array-splice.php
marcovtwout

3
@JacerOmri यह पूरी तरह से सही है, दोनों कथन मान्य हैं। आप किसी भी प्रकार का मान पास कर सकते हैं, लेकिन यह किसी सरणी, ऑब्जेक्ट, या अशक्त के लिए समान व्यवहार नहीं कर सकता है। स्केलर के लिए, टाइप-कास्टिंग (array)$scalarके बराबर है array($scalar), लेकिन एक सरणी, एक ऑब्जेक्ट, या नल के लिए, इसे अनदेखा किया जाएगा (सरणी), एक सरणी (ऑब्जेक्ट) में कनवर्ट करें, या एक खाली सरणी (शून्य) बनें - php.net
लुकास

2
@SunilPachlangia, adelval और अन्य: बहु-आयामी सरणियों के साथ आपको किसी सरणी में प्रतिस्थापन को लपेटने की आवश्यकता है, यह प्रलेखित है। मैं अभी भी यहां नोट लाया हूं ताकि लोग गलती करना बंद करें।
फेलिक्स गगनोन-ग्रेनियर

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()ऐसा नहीं करता। तो पहले फ़ंक्शन के परिणाम बहुत ही आश्चर्यजनक हो सकते हैं ... खासकर क्योंकि अगर आपके पास एक ही कुंजी के साथ दो तत्व हैं, तो केवल पिछले एक का मूल्य रखा गया है ...
एलेक्सिस विलके

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कर चाबियाँ संरक्षित कर सकते हैं
मौरिस

1
अब मैं INDEX से पहले अधिक तत्वों को जोड़ सकता हूं
अब्बास


5

कोई मूल 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;
}

1
यह ठीक काम करता है। हालांकि, दूसरे उदाहरण में, आपके फ़ंक्शन में insertBefore(), आपको $tmpArrayइसके बजाय वापस लौटना चाहिए $input
क्रिस्टोफ फिशर

4

@Hilil के शानदार जवाब के आधार पर, यहाँ बताया गया है कि कैसे एक विशिष्ट कुंजी के बाद नए तत्व को सम्मिलित किया जाए, जबकि पूर्णांक कुंजियों को संरक्षित किया जाए:

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

फ़ंक्शन स्रोत - यह ब्लॉग पोस्ट । पहले से विशिष्ट कुंजी सम्मिलित करने के लिए आसान कार्य भी है।


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 द्वारा समाधान एकदम सही है। यदि आप आइटम (ओं) को एक बहुआयामी सरणी में जोड़ना चाहते हैं, तो पहले एक आयामी सरणी जोड़ें और फिर बाद में बदलें।

$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);?
कार्टेफोर्फोरस
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.