Array_filter () 'den sonra, anahtarları 0'dan başlayarak sayısal sıraya göre nasıl sıfırlayabilirim


108

Bir diziden yalnızca '' değerine sahip girdileri kaldırmak için array_filter kullandım ve şimdi 0'dan başlayan yer tutucuya bağlı olarak bazı dönüşümleri uygulamak istiyorum, ancak ne yazık ki hala orijinal dizini koruyor. Bir süre aradım ve hiçbir şey göremedim, belki de bariz olanı kaçırdım, ama sorum şu ...

Dizinin dizinlerini eski dizinleri korumak yerine, 0'dan başlayıp YENİ dizide sıraya girecek şekilde nasıl kolayca sıfırlayabilirim?



Dizinizde boş / sıfır ish / yanlış değer olmadığından kesinlikle emin değilseniz, kullanmamanızı tavsiye etmeliyim array_filter()- istediğinizden daha fazlasını temizleyebilirsiniz. İşte bir demo ile bazı açıklamalar: stackoverflow.com/a/43657056/2943403
mickmackusa

Yanıtlar:



37

Dizi filtresi kullanıyorsanız, aşağıdaki gibi yapın

$NewArray = array_values(array_filter($OldArray));

3
Oh, bir dizinin json_encode sonucunun json_encode bir dizi_filtreli diziden farklı olduğunu anlamaya çalışırken kaybettiğim zaman ... ÇOK teşekkür ederim ...
Jerther

13

Kaç programcının masum bir şekilde array_values(array_filter())yöntemi kodlarına kopyaladığı / yapıştırdığı konusunda endişeleniyorum - dizi_filter'in açgözlülüğü nedeniyle kaç programcının farkında olmadan sorunla karşılaştığını merak ediyorum. Daha da kötüsü, işlevin diziden çok fazla değeri sildiğini keşfeden kaç kişi ...

NULLBir diziden elemanların ayrılması ve anahtarların yeniden indekslenmesi için iki parçalı işlem için daha iyi bir alternatif sunacağım .

Bununla birlikte, öncelikle, açgözlü doğasını array_filter()ve bunun projenizi sessizce nasıl baştan savacağını vurgulamalıyım . Sorunu açığa çıkaracak karışık değerler içeren bir dizi:

$array=['foo',NULL,'bar',0,false,null,'0',''];

Boş değerler, büyük / küçük harfe bakılmaksızın kaldırılacaktır.

Ancak array_values ​​() & array_filter () kullandığımızda dizide ne kaldığına bakın :

array_values(array_filter($array));

Çıktı dizisi ($ dizi):

array (
  0 => 'foo',
  1 => 'bar'
)
// All empty, zero-ish, falsey values were removed too!!!

Şimdi, yeni bir filtrelenmiş dizi oluşturmak için array_walk () & is_null () kullanan yöntemimle ne elde ettiğinize bakın :

array_walk($array,function($v)use(&$filtered){if(!is_null($v)){$filtered[]=$v;}});

Bu, daha kolay okunması / açıklanması için birden çok satıra yazılabilir:

array_walk(                      // iterate each element of an input array
    $array,                      // this is the input array
    function($v)use(&$filtered){ // $v is each value, $filter (output) is declared/modifiable
        if(!is_null($v)){        // this literally checks for null values
            $filtered[]=$v;      // value is pushed into output with new indexes
        }
    }
);

Çıktı dizisi ($ filtre):

array (
  0 => 'foo',
  1 => 'bar',
  2 => 0,
  3 => false,
  4 => '0',
  5 => '',
)

Benim yöntemimle yeniden dizine alınmış anahtarlarınızı, boş olmayan tüm değerleri ve boş değerlerin hiçbirini alamazsınız. Tüm dizi null filtreleme ihtiyaçlarınız için temiz, taşınabilir, güvenilir tek astar. İşte bir gösteri .



Benzer şekilde, boş, yanlış ve boş öğeleri (sıfırları tutan) kaldırmak istiyorsanız, bu dört yöntem işe yarayacaktır:

var_export(array_values(array_diff($array,[''])));

veya

var_export(array_values(array_diff($array,[null])));

veya

var_export(array_values(array_diff($array,[false])));

veya

var_export(array_values(array_filter($array,'strlen')));

Çıktı:

array (
  0 => 'foo',
  1 => 'bar',
  2 => 0,
  3 => '0',
)

Son olarak, dil yapılarının sözdizimini tercih eden herkes için, niteleyici değerleri yeni dizinler yayınlamak için yeni bir diziye de gönderebilirsiniz.

$array=['foo', NULL, 'bar', 0, false, null, '0', ''];

$result = [];
foreach ($array as $value) {
    if (strlen($value)) {
        $result[] = $value;
    }
}

var_export($result);

2
Yazarsan işler tam olarak beklenen şekilde davranmaz array_values(array_filter($arr, function($el) {return $el !== '';}))mı? Bu, OP'nin sorduğu şeyi yapmanın doğal yolu gibi görünüyor.
Casey

1
Evet. Demek istediğim, geliştiricilerin array_filter(), verilere ilişkin kapsamlı bilgileri yan etkiler olmaksızın açgözlü filtrelemeye izin vermedikçe , varsayılan davranışı kullanma dürtüsünden kaçınmaları gerektiğidir . (Başka bir uyarı: empty()aynı şekilde davranır ve açgözlülüğünde boş bir dizi de içerir.)
mickmackusa

2
Bu cevap, orijinaliyle hiçbir şekilde, biçimde veya biçimde ilgisi olmayan tamamen farklı bir soruyu yanıtlar.
AnrDaemon

1
array_filter()kılavuzda yazdığı şeye dayanarak tam olarak beklediğiniz gibi davranır: php.net/manual/en/function.array-filter.php "Eğer geri arama sağlanmadıysa, tüm dizi girişleri FALSE'a eşittir (boolean'a dönüştürme ) kaldırılacaktır. " Ve PHP programcıları arasında 0, null, false '' ve '0' değerlerinin boolean'a zorlandığında yanlış olarak değerlendirildiği yaygın bir bilgi olmalıdır.
madsen

1
Mesele şu ki, çoğu insan ne bekleyeceğini bilmiyor. Yapıyorsun, ben var ama çoğu yapmıyor. Bu cevabı bilmeyenlere yardım etmek için gönderdim.
mickmackusa

12

Kullanım array_values():

<?php

$array = array('foo', 'bar', 'baz');
$array = array_filter($array, function ($var) {
    return $var !== 'bar';
});

print_r($array); // indexes 0 and 2
print_r(array_values($array)); // indexes 0 and 1
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.