কোনও পিএইচপি অ্যারের মানগুলি সাফ করার সর্বোত্তম উপায়


172

কোন অ্যারেতে সমস্ত মান সাফ করার জন্য আরও দক্ষ? প্রথমটির জন্য আমার দ্বিতীয় বারের দ্বিতীয় উদাহরণটির লুপে সেই ফাংশনটি ব্যবহার করা প্রয়োজন।

foreach ($array as $i => $value) {
    unset($array[$i]);
}

অথবা এটা

foreach($blah_blah as $blah) {
    $foo = array();
    //do something
    $foo = null;
}

5
এর সাথে কী হয়েছে unset($array)?
ব্লেক

13
ভেরিয়েবল মুছে দেয়।
el_pup_le

2
হ্যাঁ, তবে আপনি কেন এমন নাল অ্যারে মূল্যায়ণ করতে চান যা আপনি সেট করেছেন?
ব্লেক

3
উৎস? মেমরির কোনও পরিবর্তনশীল মনে হয় না যে এটির চেয়ে কম হবে ভ্যার্ল নাল।
ব্লেক

উত্তর:


256

জ্যাক নীচের মন্তব্যে বলেছিলেন আপনি এটি ব্যবহার করে কেবল পুনরায় ইনস্ট্যান্ট করতে সক্ষম হবেন

$foo = array(); // $foo is still here

আপনি যদি আরও শক্তিশালী কিছু ব্যবহার না করে সেট করতে চান যেহেতু এটি প্রতীক টেবিল থেকেও পরিষ্কার হয়ে যাবে later ফু যদি পরে আপনার অ্যারের প্রয়োজন হয় তবে এটি আবার ইনস্ট্যান্ট করুন।

unset($foo); // $foo is gone
$foo = array(); // $foo is here again

63
কেন শুধু এটিকে পুনরায় ইনস্ট্যান্ট করবেন না $foo = array();?
জ্যাক জাটকিন-সোনার

2
@ নিশামমাহসিন হয় হয় ব্যবহার করুন global $foo; unset($foo);বাunset($GLOBALS['foo']);
এরিক হার্লিটজ

7
@vivoconunxino আমি লেখকরা "পিএইচপি অ্যারের মানগুলি সাফ করার সর্বোত্তম উপায়" প্রশ্নটির কারণে এটি সেভাবে লিখেছিলাম। এটি 'পরিষ্কার', 'নতুন উদাহরণ' নয়। ব্যবহার করা প্রতীক টেবিল থেকে unsetপরিষ্কার হবে $foo। আমি আমরা খুব বড় টেবিল সম্পর্কে কথা বলছি আমি সম্ভবত সুপারিশ করব $foo = null; unset($foo);যেহেতু এটি মেমরিটি আরও ভালভাবে পরিষ্কার করবে। এই আচরণটি (জিসি) খুব ধ্রুবক নয় এবং পিএইচপি সংস্করণে পরিবর্তিত হতে পারে।
এরিক হার্লিটজ

5
আনসেট () কখনও কখনও খুব খারাপ হয় এবং যদি আপনি এটি ভুল ব্যবহার করেন তবে সমস্যা দেখা দিতে পারে। এটি ওপিএসের উত্তরটির সঠিক উত্তর দেয় না। কেন তিনি এটিকে সর্বোত্তম উত্তর হিসাবে গ্রহণ করেছেন তা জানেন না, নিজের প্রশ্নে তাঁর মন্তব্য বলেছেন যে আনসেটের সমস্যাটি এটি পরিবর্তনশীলটিকে মুছে দেয়। এই সমাধানগুলির ফলে যে সমস্যাগুলি দেখা দেয় তা দেখতে, এখানে আমার উত্তরটি একবার দেখুন ।
ওল্ফসব্লিভিটি

2
সমস্ত সমর্থনকারীদের কাছে $foo = array();: আসলে এটিতে একটি ধারণাগত সমস্যা থাকতে পারে: কোনও কাঠামো পুনরায় ইনস্ট্যান্ট করা এটি খালি করার মতো নয়। মেমরির সাথে কাজ করার সময় আপনি জানেন যে বরাদ্দ ধীর হওয়ায় এটি একই জিনিস নয়। সুতরাং, ব্যবহারের স্বাচ্ছন্দ্য সত্ত্বেও, পুনঃ-ইনস্ট্যান্টেশন এই প্রশ্নের উত্তর হতে পারে না, বিশেষত যদি খুব বেশি বার এবং দ্রুত এটি করা প্রয়োজন। এটি কার্যকর হতে পারে তবে এটি পিএইচপি মেমরি পরিচালনা, আইএমওর উপর প্রচুর নির্ভর করবে।
টেকনিকুইস্ট

82

আপনি যদি কেবল একটি খালি অ্যারেতে কোনও ভেরিয়েবলটি পুনরায় সেট করতে চান তবে আপনি কেবল এটিকে পুনরায় নতুন করে দিতে পারেন:

$foo = array();

মনে রাখবেন এটি এতে কোনও রেফারেন্স বজায় রাখবে:

$foo = array(1,2,3);
$bar = &$foo;
// ...
$foo = array(); // clear array
var_dump($bar); // array(0) { } -- bar was cleared too!

আপনি যদি এর কোনও রেফারেন্স ভাঙতে চান তবে প্রথমে এটি আনসেট করুন:

$foo = array(1,2,3);
$bar = &$foo;
// ...
unset($foo); // break references
$foo = array(); // re-initialize to empty array
var_dump($bar); // array(3) { 1, 2, 3 } -- $bar is unchanged

3
আমি মনে করি এটিই সেরা উত্তর। গ্রহণ করা উচিত। এটি সহজতম উপায় দেখায় এবং কেন এবং কখন unsetব্যবহার করা উচিত তাও বর্ণনা করে । +1

এটি আমার কোড: justpaste.it/1gt46 । আমি কীভাবে একের বেশি আইডি এর ভেরিয়েবলে ঘোষণা করতে পারি। একক মান ঘোষণা: $ productId = 19; আমি কীভাবে $ productId = এ একাধিক মান ঘোষণা করতে পারি?
মণি

@ রথিনাম নিশ্চিত হন না যে অ্যারে সাফ করার সাথে এর কী দরকার। দয়া করে স্ট্যাকওভারফ্লোতে একটি নতুন প্রশ্ন পোস্ট করুন এবং আপনার কোডটি সরাসরি প্রশ্নে আটকান।
এমপেন

32

দুঃখের সাথে আমি অন্যান্য প্রশ্নের উত্তর দিতে পারছি না, যথেষ্ট খ্যাতি নেই, তবে আমার পক্ষে এমন একটি বিষয় উল্লেখ করা দরকার যা আমার পক্ষে অত্যন্ত গুরুত্বপূর্ণ ছিল এবং আমি মনে করি এটি অন্যান্য ব্যক্তিকেও সহায়তা করবে।

ভেরিয়েবলটি আনসেট করা একটি দুর্দান্ত উপায়, যদি না আপনার মূল অ্যারের রেফারেন্সের প্রয়োজন হয়!

আমার অর্থটি পরিষ্কার করার জন্য: আপনার যদি কোনও ফাংশন থাকে তবে অ্যারের রেফারেন্সটি ব্যবহার করে যেমন উদাহরণস্বরূপ একটি বাছাইকরণ ফাংশন

function special_sort_my_array(&$array)
{
    $temporary_list = create_assoziative_special_list_out_of_array($array);

    sort_my_list($temporary_list);

    unset($array);
    foreach($temporary_list as $k => $v)
    {
        $array[$k] = $v;
    }
}

এটা কাজ করছে না! এখানে সতর্কতা অবলম্বন করুন, unsetরেফারেন্সটি মুছে দিন, তাই পরিবর্তনশীলটি $arrayআবার তৈরি করা হয়েছে এবং সঠিকভাবে পূরণ করা হয়েছে, তবে মানগুলি ফাংশনের বাইরে থেকে অ্যাক্সেসযোগ্য নয়।

সুতরাং আপনার যদি রেফারেন্স থাকে তবে আপনার $array = array()পরিবর্তে এটি ব্যবহার করা দরকার unset, যদিও এটি কম পরিষ্কার এবং বোধগম্য।


3
এটির উত্তর হওয়া উচিত - ওপি স্পষ্ট অ্যারে মানগুলি বলে, পুরো অ্যারে ভেরিয়েবলটিকে ডি-রেফারেন্স নয়।
রস

13

আমি আগে বলব, অ্যারেটি যদি সাহসী হয়। যদি তা না হয় তবে একটি forলুপ ব্যবহার করুন :

for ($i = 0; $i < count($array); $i++) { unset($array[$i]); }

যদিও সম্ভব হয়, ব্যবহার করছি

$array = array();

খালি অ্যারেটিতে অ্যারেটি পুনরায় সেট করা ভাল।





2

অ্যারে সাফ করার জন্য আমি আনসেট () ব্যবহার করেছি তবে আমি বুঝতে পেরেছি যে আনসেট () অ্যারে নালকে রেন্ডার করবে তাই উদাহরণস্বরূপ অ্যারেটিকে পুনরায় ঘোষণা করার প্রয়োজন

<?php 
    $arr = array();
    array_push($arr , "foo");
    unset($arr); // this will set the array to null hence you need the line below or redeclaring it.
    $arr  = array();

    // do what ever you want here
?>

1

আমি দেখতে পাচ্ছি এই প্রশ্নগুলি রিয়েল পুরানো, তবে সেই সমস্যার জন্য আমি অ্যারেতে সমস্ত মান আনসেট করতে একটি পুনরাবৃত্ত ফাংশন লিখেছিলাম। রিকার্সিভ কারণ এটি সম্ভব যে প্রদত্ত অ্যারে থেকে মানগুলিও একটি অ্যারে। সুতরাং এটি আমার পক্ষে কাজ করে:

function empty_array(& $complete_array) {
    foreach($complete_array as $ckey => $cvalue)
    {
        if (!is_array($cvalue)) {
            $complete_array[$ckey] = "";
        } else {
            empty_array( $complete_array[$ckey]);
        }

    }
    return $complete_array;

}

সুতরাং এটির সাথে আমি সমস্ত কী এবং উপ-অ্যারেগুলি দিয়ে অ্যারে পাই তবে খালি মান।


1

হতে পারে সহজ, অর্থনৈতিক উপায় (ব্যবহারের জন্য কম লক্ষণ) ...

$array = [];

আমরা পিএইচপি ম্যানুয়াল পড়তে পারি:

পিএইচপি 5.4 এর হিসাবে আপনি সংক্ষিপ্ত অ্যারে সিনট্যাক্সও ব্যবহার করতে পারেন, যা [] এর সাথে অ্যারে () এর প্রতিস্থাপন করে।


আপনারও এটি ব্যাখ্যা করা উচিত।
কুলশ্রেষ্ঠ কে

0

সেট না ফাংশন দরকারী যখন আবর্জনা সংগ্রাহক তার চক্রের সময় লাঞ্চ বিরতির থাকার করছেন না হয়;

তবে আনসেট ফাংশনটি সহজেই ডেটাগুলির পরিবর্তনশীল রেফারেন্সটিকে নষ্ট করে, ডেটা মেমরিতে এখনও বিদ্যমান এবং পিএইচপি মেমরিটির কোনও পয়েন্টার না থাকা সত্ত্বেও ব্যবহার হিসাবে ব্যবহার করে।

সমাধান:null ডেটা সাফ করার জন্য আপনার ভেরিয়েবলগুলিকে অর্পণ করুন, কমপক্ষে যতক্ষণ না আবর্জনা সংগ্রহকারী এটিকে ধরে না যায়।

$var = null;

এবং তারপরে এটি একইভাবে আনসেট করুন!

unset($var);

4
এটি ঠিক শোনাচ্ছে না। আমি মনে করি না এটি সেট করা nullতাৎক্ষণিক আবর্জনা সংগ্রহের জন্য বাধ্য করবে। আপনি কি তার জন্য একটি রেফারেন্স আছে?
এমপেন

@ এমপেন আপনি কি সম্মত হন যে এই উদাহরণে ভেরিয়েবলের NULLস্থানে সঞ্চিত মানটি স্থানান্তরিত করবে $var?
অ্যান্টনি রুটলেজ

1
পুনঃটুইট করুন আমি জানি সকলের জন্য, পিএইচপি কেবলমাত্র $varকিছু গ্লোবাল NULLঅবজেক্টের দিকে নির্দেশ করতে আপডেট করবে এবং $varআবর্জনা সংগ্রহ না করা অবধি কেবলমাত্র ডেটা একা রেখে দেবে । কেন দোভাষী তত্ক্ষণাত সেই ডেটা ওভাররাইট করতে বাধ্য হবেন?
এমপিনে

@ এমপেন এটি একটি ভাল প্রশ্ন, তবে সেই বিশ্বে কমপক্ষে সবকিছু সংগ্রহ করার জন্য প্রস্তুত।
অ্যান্টনি রুটলেজ

প্রকৃতপক্ষে. পয়েন্টটি হ'ল আমি সন্দেহ করি যে এটি সেট না করার আগে এটিকে নির্ধারণ করা সন্দেহ করে যে
কোনওরকম

-1

এটি শক্তিশালী এবং পরীক্ষিত আনসেট ($ গ্রেডারে); // অ্যারেটিকে পুনরায় সেট করুন


1
প্রশ্নের উত্তরের জন্য আপনার ব্যাখ্যা করা উচিত যে কোনটি সেরা উপায় এবং কেন
ফ্যাবিয়ান হরল্যাচার
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.