तत्वों को परेशान करने के बाद सरणी कुंजियों को पुन: लिखें


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

Array_values ​​() का उपयोग करना


6
+1। मैं ध्यान देता हूं कि मैन्युअल रूप से यह स्पष्ट नहीं है कि आदेश बनाए रखा जाएगा, लेकिन मैं यह नहीं देख सकता कि यह क्यों नहीं होगा।
ऑर्बिट में लाइटनेस दौड़

16
हां, ऑर्डर करना निश्चित रूप से बनाए रखा है। यदि यह इसे फिर से व्यवस्थित करता है तो यह एक गुप्त कार्य होगा! :)
वेबबिडीव

1
@webbiedave क्षमा करें, लेकिन यह सच नहीं है। यह वास्तव में मेरे सरणी को फिर से व्यवस्थित करता है। बहुत अजीब है।
फूबर

4
हमेशा आसान संक्षिप्त समाधान के लिए जाएं :)
ब्रूस लिम

1
हालांकि यह एक आसान समाधान है जब सरणी पहले से ही क्रमांकित है, यह तब काम नहीं करता है जब कुंजी को टेक्स्ट के रूप में सेट किया जाता है, जैसे कि यह HTML फॉर्म का हिस्सा होगा। यदि आप किसी प्रपत्र से आउटपुट की पहचान करने के लिए अनन्य कुंजी मानों पर भरोसा कर रहे हैं, तो नीचे दिए गए तरीकों में से एक बेहतर तरीके से काम करता है।

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
ये काम नहीं कर रहा है। ब्याह भयानक होगा, लेकिन आप इसे for / foreach लूप के अंदर उपयोग नहीं कर सकते क्योंकि यह हर बार आपके द्वारा कॉल किए जाने पर अनुक्रमणिका को पुनर्व्यवस्थित करता है, इसलिए foreach loop का सूचकांक अगले तत्व को इंगित नहीं करता है लेकिन उस स्थिति वाले तत्व को पुनर्व्यवस्थित सरणी पर। आप उदाहरण में देख सकते हैं कि आप '3' का मान हटा रहे हैं और '2' का मान छोड़ रहे हैं, जब आपको केवल '1' और '2' को हटाना चाहिए
NotGaeL

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

जैसा कि आप देखते हैं, मैं बंटवारे से पहले $ i को हेरफेर करता हूं क्योंकि मैं वर्तमान आइटम के बजाय पिछले को हटाने की मांग कर रहा हूं।


1

उत्तर देर से लेकिन, PHP 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)जो इसे उपलब्ध नहीं कराएंगे वह आपके लूप में मौजूद है। 2) आप दूसरी से अंतिम पंक्ति में अर्धविराम को याद कर रहे हैं। यह कोड स्निपेट नहीं चलेगा।
रॉकिन 4लाइफ33
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.