PHP - 使用array_filter从哈希表(数组)中删除项目

时间:2009-04-28 21:23:25

标签: php arrays array-filter

在PHP中,我知道一旦将项目放入数组中,就没有正式的方法来删除它们。但对我的问题必须有一个“最好的方法”解决方案。我相信这可能在于array_filter功能。

基本上,我有一个购物车对象,可以将项目存储在哈希表中。想象一下,你一次只能购买任何一件物品。

我做

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

get_count()仍会返回2.

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

人们认为在get_count中使用的最佳方法是什么?我无法弄清楚使用array_filter的最佳方法,它只是不返回错误的值(没有编写单独的回调)。

谢谢:)

3 个答案:

答案 0 :(得分:8)

没有官方的方式?当然有! 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();

另外,这是PHP4吗?因为如果没有,您应该查看一些SPL内容,例如ArrayObject或至少CountableArrayAccess接口。

修改

这是直接使用接口的版本

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

这是一个作为ArrayObject

实现的版本
<?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 );

答案 1 :(得分:5)

if ($this->items[$id]) {

可能会返回警告,应该使用array_key_exists或isset。

unset()似乎比删除项目时分配false更清晰(也会消除你的计数问题)。

答案 2 :(得分:3)

彼得和马里奥的回答都是+1:使用unset()是从数组中删除项目的正确方法。

我只想留言以解释为什么你的方法不起作用。使用count()将计算数组中的值的数量。 false,虽然你可以想象它意味着“没有”,但实际上仍然是一个价值。通常,如果您想要实际指定“无值”,请使用null

您也可以通过将数组元素设置为null来取消设置,但请查看下面的代码以查看差异。

$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