আনসেটিং উপাদানগুলির পরে অ্যারে কীগুলি রিবেস করুন


183

আমার একটি অ্যারে আছে:

$array = array(1,2,3,4,5);

আমি যদি অ্যারের বিষয়বস্তুগুলি ফেলে দিই তবে তারা এ জাতীয় দেখতে পাবে:

array(5) {
  [0] => int(1)
  [1] => int(2)
  [2] => int(3)
  [3] => int(4)
  [4] => int(5)
}

যখন আমি নির্দিষ্ট কীগুলি লুপ করি এবং আনসেট করি, তখন সূচক সমস্ত জ্যাক আপ হয়ে যায়।

foreach($array as $i => $info)
{
  if($info == 1 || $info == 2)
  {
    unset($array[$i]);
  }
}

পরবর্তীকালে, আমি যদি এখন অন্য একটি ডাম্প করি তবে এটি দেখতে দেখতে এমন হবে:

array(3) {
  [2] => int(3)
  [3] => int(4)
  [4] => int(5)
}

অ্যারে পুনরায় সেট করার কোনও সঠিক উপায় আছে যাতে এর উপাদানগুলি আবার জিরো ভিত্তিক হয় ??

array(3) {
  [0] => int(3)
  [1] => int(4)
  [2] => int(5)
}

উত্তর:


411

এটা চেষ্টা কর:

$array = array_values($array);

অ্যারে_ভ্যালুগুলি ব্যবহার করে ()


6
+1 টি। আমি নোট করেছি যে ম্যানুয়ালটি সুস্পষ্টভাবে নির্দেশ করে না যে ক্রম বজায় রাখা হবে, তবে কেন হবে না তা আমি দেখতে পাচ্ছি না।
অরবিটে মেঘের হালকাতা রেস

16
হ্যাঁ, অর্ডার অবশ্যই বজায় রাখা হয়। এটির পুনঃস্থাপন করা হলে একটি ঘৃণ্য কাজ হবে! :)
ওয়েববিডেভ

1
@ ওয়েবিবিভে দুঃখিত, তবে এটি সত্য নয়। এটি আসলে আমার অ্যারের পুনঃক্রম করে। খুব খুব আজব।
ফুবার

4
সর্বদা সহজ সংক্ষিপ্ত সমাধানগুলির জন্য যান :)
ব্রুস লিম

1
অ্যারেটি ইতিমধ্যে সংখ্যাযুক্ত থাকাতে এটি একটি সহজ সমাধান, কীটি পাঠ্য হিসাবে সেট করার পরে এটি কার্যকর হয় না, যেমন এটি কোনও HTML ফর্মের অংশ হিসাবে হয় of যদি আপনি কোনও ফর্ম থেকে আউটপুট সনাক্ত করতে অনন্য কী মানগুলির উপর নির্ভর করে থাকেন তবে নীচের একটি পদ্ধতি আরও ভাল কাজ করে।

17

আরও একটি আকর্ষণীয় পদ্ধতি পেয়েছি:

$array = array('a', 'b', 'c', 'd'); 
unset($array[2]); 

$array = array_merge($array); 

এখন $ অ্যারে কীগুলি পুনরায় সেট করা হয়েছে।


13

array_spliceপরিবর্তে ব্যবহার করুন unset:

$array = array(1,2,3,4,5);
foreach($array as $i => $info)
{
  if($info == 1 || $info == 2)
  {
    array_splice($array, $i, 1);
  }
}

print_r($array);

নমুনা এখানে কাজ


7
এটি কাজ করছে না। বিভাজক দুর্দান্ত হবে তবে আপনি এটি / ফরচ লুপের অভ্যন্তরে ব্যবহার করতে পারবেন না কারণ এটি যখনই আপনি কল করবেন তখনই সূচীটিকে পুনরায় সাজিয়ে তোলে, সুতরাং আগাম লুপের সূচকটি পরবর্তী উপাদানটির দিকে নির্দেশ করে না তবে সেই অবস্থানের সাথে উপাদানটির দিকে নির্দেশ করে পুনরায় সাজানো অ্যারেতে। আপনি দেখতে পাচ্ছেন উদাহরণস্বরূপ আপনি '3' মানটি মুছে
ফেলছেন

1
@elcodedocle তারপরে একটি foreachলুপ ব্যবহার করবেন না । স্ট্যান্ডার্ডটি ব্যবহার করুন i Loopএবং একটি স্প্লাইস পরে কেবল রিসেট করুন। এছাড়াও, Working sample here.কাজ করছে না।
SpYk3HH

ভাঙা লিঙ্ক, আপনি কি এটি ঠিক করতে পারবেন?
মিশেল আইরেস

5

শুধু একটি অ্যাডেটিভ।

আমি জানি এটি পুরানো , তবে আমি একটি সমাধান যুক্ত করতে চেয়েছিলাম যে আমি নিজের সাথে এসেছি তা দেখতে পাচ্ছি না। একটি পৃথক সমাধানের সন্ধানের সময় এই প্রশ্নটি খুঁজে পেয়েছে এবং স্রেফ এই চিত্রটি পেয়েছেন, "আচ্ছা, আমি এখানে থাকি"।

প্রথমত, নীলের উত্তরটি আপনার লুপটি চালানোর পরে ব্যবহার করা ভাল এবং দুর্দান্ত, তবে আমি একবারে সমস্ত কাজ করতে পছন্দ করব। অবশ্যই, আমার নির্দিষ্ট ক্ষেত্রে আমাকে এখানে এই সাধারণ উদাহরণের চেয়ে বেশি কাজ করতে হয়েছিল , তবে এখনও পদ্ধতিটি প্রয়োগ হয়। আমি দেখেছি যেখানে অন্য এক দম্পতি foreachলুপের পরামর্শ দিয়েছিল , তবে এটি জন্তুটির প্রকৃতির কারণে এটি আপনাকে কাজের পরে ছেড়ে চলেছে। সাধারণত আমি সহজ বিষয়গুলির মতো পরামর্শ দিই foreach, তবে এই ক্ষেত্রে ভাল ভাল পুরানো ফ্যাশন for loopযুক্তি মনে রাখা ভাল । সহজভাবে ব্যবহার করুন i! যথাযথ সূচক বজায় রাখতে, iঅ্যারের আইটেমের প্রতিটি অপসারণের পরে কেবল বিয়োগ করুন।

এখানে আমার সহজ, কার্যকারী উদাহরণ:

$array = array(1,2,3,4,5);

for ($i = 0; $i < count($array); $i++) {
    if($array[$i] == 1 || $array[$i] == 2) {
        array_splice($array, $i, 1);
        $i--;
    }
}

আউটপুট দেবে:

array(3) {
    [0]=> int(3)
    [1]=> int(4)
    [2]=> int(5)
}

এটিতে অনেকগুলি সাধারণ বাস্তবায়ন থাকতে পারে। উদাহরণস্বরূপ, আমার সঠিক ক্ষেত্রে বহুমাত্রিক মানের উপর ভিত্তি করে অ্যারেতে সর্বশেষ আইটেমটি ধরে রাখা দরকার। আমি কী বলতে চাইছি তা আমি আপনাকে প্রদর্শন করব:

$files = array(
    array(
        'name' => 'example.zip',
        'size' => '100000000',
        'type' => 'application/x-zip-compressed',
        'url' => '28188b90db990f5c5f75eb960a643b96/example.zip',
        'deleteUrl' => 'server/php/?file=example.zip',
        'deleteType' => 'DELETE'
    ),
    array(
        'name' => 'example.zip',
        'size' => '10726556',
        'type' => 'application/x-zip-compressed',
        'url' => '28188b90db990f5c5f75eb960a643b96/example.zip',
        'deleteUrl' => 'server/php/?file=example.zip',
        'deleteType' => 'DELETE'
    ),
    array(
        'name' => 'example.zip',
        'size' => '110726556',
        'type' => 'application/x-zip-compressed',
        'deleteUrl' => 'server/php/?file=example.zip',
        'deleteType' => 'DELETE'
    ),
    array(
        'name' => 'example2.zip',
        'size' => '12356556',
        'type' => 'application/x-zip-compressed',
        'url' => '28188b90db990f5c5f75eb960a643b96/example2.zip',
        'deleteUrl' => 'server/php/?file=example2.zip',
        'deleteType' => 'DELETE'
    )
);

for ($i = 0; $i < count($files); $i++) {
    if ($i > 0) {
        if (is_array($files[$i-1])) {
            if (!key_exists('name', array_diff($files[$i], $files[$i-1]))) {
                if (!key_exists('url', $files[$i]) && key_exists('url', $files[$i-1])) $files[$i]['url'] = $files[$i-1]['url'];
                $i--;
                array_splice($files, $i, 1);
            }
        }
    }
}

আউটপুট দেবে:

array(1) {
    [0]=> array(6) {
            ["name"]=> string(11) "example.zip"
            ["size"]=> string(9) "110726556"
            ["type"]=> string(28) "application/x-zip-compressed"
            ["deleteUrl"]=> string(28) "server/php/?file=example.zip"
            ["deleteType"]=> string(6) "DELETE"
            ["url"]=> string(44) "28188b90db990f5c5f75eb960a643b96/example.zip"
        }
    [1]=> array(6) {
            ["name"]=> string(11) "example2.zip"
            ["size"]=> string(9) "12356556"
            ["type"]=> string(28) "application/x-zip-compressed"
            ["deleteUrl"]=> string(28) "server/php/?file=example2.zip"
            ["deleteType"]=> string(6) "DELETE"
            ["url"]=> string(45) "28188b90db990f5c5f75eb960a643b96/example2.zip"
        }
}

আপনি দেখতে পাচ্ছেন, আমি উপস্থিত আইটেমের চেয়ে আগেরটি সরিয়ে ফেলতে চাইছি বলে আমি স্প্লাইসের আগে হেরফের করি।


1

দেরীতে উত্তর কিন্তু, পিএইচপি 5.3 এর পরে এমন হতে পারে;

$array = array(1, 2, 3, 4, 5);
$array = array_values(array_filter($array, function($v) {
    return !($v == 1 || $v == 2);
}));
print_r($array);

1

অথবা আপনি আপনার নিজের ফাংশনটি তৈরি করতে পারেন যা রেফারেন্স দ্বারা অ্যারে পাস করে।

function array_unset($unsets, &$array) {
  foreach ($array as $key => $value) {
    foreach ($unsets as $unset) {
      if ($value == $unset) {
        unset($array[$key]);
        break;
      }
    }
  }
  $array = array_values($array);
}

তাহলে আপনাকে যা করতে হবে তা হ'ল ...

$unsets = array(1,2);
array_unset($unsets, $array);

... এবং এখন আপনার $arrayদেওয়া মানগুলি বাদ দিয়ে $unsetsএবং কীগুলি পুনরায় সেট করা হয়েছে


1

আমার জন্য 100% কাজ! অ্যারেতে উপাদানগুলি আনসেট করার পরে আপনি এটিকে পুনরায় সূচকের জন্য ব্যবহার করতে পারেন

$result=array_combine(range(1, count($your_array)), array_values($your_array));

0

আমি $arr = array_merge($arr); একটি অ্যারে পুনর্বাসনের জন্য ব্যবহার করি । সরল ও সোজা।


-2

আমার পরিস্থিতিতে, অ্যারের মানগুলির সাথে আমার অনন্য কীগুলি ধরে রাখা দরকার, তাই আমি সবেমাত্র একটি দ্বিতীয় অ্যারে ব্যবহার করেছি:

$arr1 = array("alpha"=>"bravo","charlie"=>"delta","echo"=>"foxtrot");
unset($arr1);

$arr2 = array();
foreach($arr1 as $key=>$value) $arr2[$key] = $value;
$arr1 = $arr2
unset($arr2);

1) আপনি unset($arr1)যা এটি আপনার লুপে পুনরাবৃত্তি উপলব্ধ না করা হবে। ২) আপনি দ্বিতীয় থেকে শেষ লাইনে অর্ধপরিবাহটি মিস করছেন। এই কোড স্নিপেট চলবে না।
রকিন
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.