PHP - array_filter kullanarak Hash Tablosundan Öğe (dizi) Sil

3 Cevap php

PHP, onlar bir diziye koymak edilmiştir kez öğeleri silmek için hiçbir resmi yolu olduğunu biliyorum. Ama benim soruna bir "en iyi yöntem" çözüm olmalıdır. Ben bu array_filter fonksiyonu yalan olabilir inanıyoruz.

Esasen, ben bir hashtable öğeleri depolayan bir alışveriş sepeti nesnesi var. Eğer sadece hiç bir zaman herhangi bir öğenin satın alabilirsiniz düşünün.

Yapmam

add_item(1);
add_item(2);
remove_item(1);

get_count() hala 2 döndürür.

var $items;


function add_item($id) {
	$this->items[$id] = new myitem($id);
}

function remove_item($id) {
	if ($this->items[$id]) {
		$this->items[$id] = false;
		return true;
	} else {	
		return false;
	}
}


function get_count() {
	return count($this->items);
}

Insanlar get_Count kullanmak için en iyi yöntem nedir sizce? Ben sadece (ayrı geri arama yazmadan) yanlış değerleri çıkmıyorsa array_filter kullanmak için en iyi yolu anlamaya olamaz.

Teşekkürler :)

3 Cevap

Hiçbir resmi yolu? Elbette var! Unset!

<?php

class foo
{
    var $items = array();


    function add_item($id) {
            $this->items[$id] = new myitem($id);
    }

    function remove_item($id)
    {
        unset( $this->items[$id] );

    }


    function get_count() {
            return count($this->items);
    }
}

class myitem
{
    function myitem( $id )
    {
    	// nothing
    }
}

$f = new foo();

$f->add_item( 1 );
$f->add_item( 2 );

$f->remove_item( 1 );

echo $f->get_count();

Ayrıca, bu PHP4 mi? Değilse, sen ArrayObject veya Countable ve ArrayAccess arayüzleri azından gibi SPL bazı şeyler içine bakmak gerekir çünkü.

EDIT

Burada doğrudan arayüzleri kullanarak bir versiyonu

<?php

class foo implements ArrayAccess, Countable
{
    protected $items = array();

    public function offsetExists( $offset )
    {
    	return isset( $this->items );
    }

    public function offsetGet( $offset )
    {
    	return $this->items[$offset];
    }

    public function offsetSet( $offset, $value )
    {
    	$this->items[$offset] = $value;
    }

    public function offsetUnset( $offset )
    {
    	unset( $this->items[$offset] );
    }

    public function count()
    {
    	return count( $this->items );
    }

    public function addItem( $id )
    {
    	$this[$id] = new myitem( $id );
    }
}

class myitem
{
    public function __construct( $id )
    {
    	// nothing
    }
}

$f = new foo();

$f->addItem( 1 );
$f->addItem( 2 );
unset( $f[1] );

echo count( $f );

Ve burada DiziNesnesi bir uygulama olarak bir versiyonu

<?php

class foo extends ArrayObject
{
    public function addItem( $id )
    {
    	$this[$id] = new myitem( $id );
    }
}

class myitem
{
    public function __construct( $id )
    {
    	// nothing
    }
}

$f = new foo();

$f->addItem( 1 );
$f->addItem( 2 );
unset( $f[1] );

echo count( $f );
if ($this->items[$id]) {

Bir uyarı döndürebilir, array_key_exists veya isset kullanmalısınız.

unset () Bir öğeyi (aynı zamanda sayımı sorunun kurtulmak olacaktır) sökerken yanlış atama daha temiz görünüyor.

Hem Peter ve Mario'nun cevaplar 1: unset() bir diziden öğe kaldırmak için doğru yolu kullanarak.

Ben sadece senin yöntem çalışmıyor neden açıklamak için bir not bırakmak istedim. count(), bir dizideki değerlerin sayısını olacak kullanma. false, sen "hiçbir şey" anlamına olarak düşünebiliriz rağmen, aslında hala bir değerdir. Genellikle aslında "hiçbir değeri" daha sonra kullanmak belirtmek istiyorsanız null.

Ayrıca unset ayarlanarak bir dizi elemanı null, olsa farkı görmek için aşağıdaki kodu bakabilirsiniz.

$x = array("a", "b", "c");

var_dump(isset($x[0]));   // bool(true)
var_dump(isset($x[1]));   // bool(true)
var_dump(isset($x[2]));   // bool(true)
echo count($x);           // 3

$x[2] = null;
var_dump(isset($x[2]));   // bool(false) -- the value is not set any longer
echo count($x);           // 3  -- but it doesn't remove it from the array

unset($x[1]);
var_dump(isset($x[1]));   // bool(false)
echo count($x);           // 2