Birden çok dizi öğesini ayırmanın daha iyi yolu


84

Buradaki anlaşma, 17 elemanlı bir dizim olması. Belli bir süre için ihtiyacım olan öğeleri alıp diziden kalıcı olarak çıkarmak istiyorum.

İşte kod:

$name = $post['name'];
$email = $post['email'];
$address = $post['address'];
$telephone = $post['telephone'];
$country = $post['country'];

unset($post['name']);
unset($post['email']);
unset($post['address']);
unset($post['telephone']);
unset($post['country']);

Evet kod çirkin, vurmaya gerek yok. Bunun daha iyi görünmesini nasıl sağlayabilirim?

Yanıtlar:


109

Kaldırmak için array_diff_key kullanın

$remove = ['telephone', 'country'];

array_diff_key($post, array_flip($remove));

Tutulacak bir anahtar dizisi sağlamak istiyorsanız array_intersect_key kullanabilirsiniz.


6
Bu yöntemin neden kazanan cevap olarak kabul edilmediğini anlamayın, çünkü aslında bir cazibe olarak çalışıyor !!
Alex

Parlak! Güzel bir. Dizi üzerinde döngü yapmak ve öğeleri ayarlamak yerine bunu seviyorum.
lifo

1
Akıllı çözüm !!
MAZux

akıllı ama büyük giriş dizileri için yavaş. foreach unset, büyük girdi dizileriyle ve (en azından) görece az sayıda anahtarla unset ile çok daha hızlı görünür.
slepic

101

Görünüşe göre işlev extract(), yapmaya çalıştığınız şey için daha iyi bir araç olacaktır (bir diziden tüm anahtar / değerleri çıkardığını ve bunları yerel kapsamdaki anahtarlarla aynı adlara sahip değişkenlere atadığını varsayarsak). İçeriği çıkardıktan sonra, istediğiniz $postbaşka bir şey içermediğini varsayarak tümünün ayarını kaldırabilirsiniz .

Bununla birlikte, sorunuzu gerçekten cevaplamak için, kaldırmak ve döngü yapmak istediğiniz anahtarlardan oluşan bir dizi oluşturabilir, bunları açıkça silebilirsiniz ...

$removeKeys = array('name', 'email');

foreach($removeKeys as $key) {
   unset($arr[$key]);
}

... ya da değişkeni, anahtarların kaldırıldığı yeni bir diziye yönlendirebilirsiniz ...

$arr = array_diff_key($arr, array_flip($removeKeys));

... veya tüm dizi üyelerini unset()...

unset($arr['name'],  $arr['email']);

8
array_diff_key () güzel bir çözümdür. Sana kullanabileceği eklersiniz düşündüm ) (array_intersect_key ters yapmak, sadece belirli öğeleri tutmak
batfastad

1
Ben bbradley beraberim - array_diff_key harika bir çözümdür
Michael

Şans eseri bu şeyi foreach durgun haldeyken yapıyordum. Sonra daha iyi bir çözüm olabileceğini düşündüm. Google beni buraya yönlendiriyor. Bu yüzden array_diff_key'i denedim ve büyük girdi dizileri için foreach'ten çok daha yavaş olduğu ortaya çıktı (en azından ayarlanacak anahtarların sayısı nispeten küçük olduğunda).
slepic

47

Yukarıdaki örneklerden daha iyi olan başka bir yol daha var. Kaynak: http://php.net/manual/en/function.unset.php

Dizinin tamamı boyunca döngü yapmak ve tüm anahtarlarını kaldırmak yerine, şu şekilde bir kez ayarını kaldırabilirsiniz:

Örnek Dizi:

$array = array("key1", "key2", "key3");

Tüm dizi için:

unset($array);

Benzersiz anahtarlar için:

unset($array["key1"]);

Bir dizide birden çok anahtar için:

unset($array["key1"], $array["key2"], $array["key3"] ....) and so on.

Umarım bu, gelişiminizde size yardımcı olur.


2

Bu sorunun eski olduğunu anlıyorum, ancak bunu yapmanın en uygun yolu olabileceğini düşünüyorum:

$vars = array('name', 'email', 'address', 'phone'); /* needed variables */
foreach ($vars as $var) {
    ${$var} = $_POST[$var]; /* create variable on-the-fly */
    unset($_POST[$var]); /* unset variable after use */
}

Artık $ name, $ email, ... her yerden kullanabilirsiniz;)

NB: extract () güvenli değil, bu yüzden tamamen söz konusu değil!


Meraktan - extract () neden güvenli değil?
Srdjan Marjanovic


Oh! İyi bir! Teşekkürler!
Srdjan Marjanovic
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.