পিএইচপি-তে কোনও অবস্থানে অ্যারেতে নতুন আইটেম .োকান


495

আমি কীভাবে কোনও অবস্থানে অ্যারেতে একটি নতুন আইটেম inোকাতে পারি, উদাহরণস্বরূপ অ্যারের মাঝখানে?


উত্তর:


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
এটি অদ্ভুত যে এই জাতীয় মৌলিক কার্যকারিতা প্রকৃতপক্ষে লুকানো থাকে, ডকুমেন্টেশনে বর্ণিত এই ফাংশনের মূল উদ্দেশ্যটি কিছু আলাদা (অ্যারেগুলিতে স্টাফ প্রতিস্থাপন)। হ্যাঁ, এটি আর্গুমেন্ট বিভাগে দেখানো হয়েছে, তবে অ্যারেতে sertোকানোর জন্য কী ব্যবহার করতে হবে তা সন্ধান করার জন্য যদি আপনি কেবল ফাংশন বর্ণনাকে স্ক্যান করে থাকেন তবে আপনি এটি কখনও খুঁজে পেতে পারেন নি।
মাহন

23
কেবল এই বলে যে এটি $insertedঅ্যারেতে কীগুলি সংরক্ষণ করবে না ।
মৌরি

6
এছাড়াও পিএইচপি ম্যানুয়ালটিতে, উদাহরণ # 1: php.net/manual/en/function.array-splice.php
marcovtwout

3
@ জেসেরোমরি এটি সম্পূর্ণ সঠিক, উভয় বক্তব্যই বৈধ। আপনি যে কোনও ধরণের মান পাস করতে পারেন তবে এটি কোনও অ্যারে, কোনও বস্তু বা শূন্যের জন্য একই রকম আচরণ করবে না। স্কেলারের ক্ষেত্রে, টাইপ-কাস্টিং (array)$scalarসমান array($scalar), তবে অ্যারে, একটি অবজেক্ট বা নালটির জন্য এটি উপেক্ষা করা হবে (অ্যারে), একটি অ্যারে (অবজেক্ট) এ রূপান্তরিত হবে, বা খালি অ্যারে (নাল) হয়ে যাবে - দেখুন php.net / ম্যানুয়াল / এন / ...
লুকাশ

2
@ সুনীলপাচলঙ্গিয়া, অ্যাডভালওয়াল এবং অন্যান্য: বহুমাত্রিক অ্যারেগুলির সাথে আপনাকে প্রতিস্থাপনটি একটি অ্যারেতে মোড়ানো প্রয়োজন, এটি নথিভুক্ত। আমি এখনও এখানে নোটটি এনেছি যাতে লোকেরা ভুল করা বন্ধ করে দেয়।
ফলিক্স গ্যাগন-গ্রেনিয়ার

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
এখন আমি একটি আইএনডেক্সের আগে আরও উপাদান যুক্ত করতে পারি
আব্বাস

5

এইভাবে আপনি অ্যারে sertোকাতে পারেন:

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

2
এই ফাংশনটি অ্যারেতে অর্ডারটি সংরক্ষণ করে না।
ড্যানিয়েল পেট্রোভালিয়েভ

5

কোনও স্থানীয় পিএইচপি ফাংশন নেই (যা সম্পর্কে আমি অবগত) যা আপনি অনুরোধ করেছেন ঠিক তেমন করতে পারে।

আমি 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

@ হিলিল দুর্দান্ত উত্তরের উপর ভিত্তি করে, পূর্ণসংখ্যা কীগুলি সংরক্ষণ করার সময় একটি নির্দিষ্ট কী পরে নতুন উপাদান কীভাবে সন্নিবেশ করা যায় তা এখানে সহজ ফাংশন:

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

এসোসিয়েটিভ অ্যারের জন্য এটিই আমার পক্ষে কাজ করেছিল:

/*
 * 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

দ্রষ্টব্য: অ্যারে_স্প্লাইস সহ একটি বহুমাত্রিক অ্যারেতে আইটেমগুলি যুক্ত করা কেবল সমস্ত আইটেমের পরিবর্তে সমস্ত সূচককে আইটেম হিসাবে যুক্ত করবে।


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);?
কার্টবিফোরহর্স
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.