PHP Map键(数组)按数字删除不起作用?

时间:2013-08-25 11:11:14

标签: php arrays

这是我的Map类:

/**
 * Map
 *
 * Collection of items, with a key.
 * @Author Jony <artemkller@gmail.com>
 */

Class Map
{
    /**
     * Annonymous Constructor
     * Sets up the array.
     */

    function __construct()
    {
        $this->map = array();
    }

    /**
     * Method add
     * Adds a new item to the collection with a key.
     *
     * Note: Key can NOT be numeric!
     *
     * @param key       The key of the item.
     * @param value     The value of the item.
     * @return void
     */

    public function add($key, $value)
    {
        $this->map[$key] = $value;
    }

    /**
     * Contains
     * Checks if an item with specific key exists.
     *
     * @param key The key.
     * @return Boolean
     */

    public function contains($key)
    {
        if (!is_numeric($key))
        {
            return (isset($this->map[$key])) ? true : false;
        }
        else
        {
            $values = array_values($this->map);
            return (isset($values[$key])) ? true : false;
        }
    }

    /**
     * Method remove
     * Removes an item from the collection by key.
     *
     * @param key   The key of the item.
     * @return void
     */

    public function remove($key)
    {
        if (!is_numeric($key))
        {
            if (isset($this->map[$key]))
                unset($this->map[$key]);
        }
        else
        {
            $values = array_values($this->map);
            if (isset($values[$key]))
            {
                unset($values[$key]);
            }
        }
    }

    /**
     * Method get
     * Gets an item from the collection by key.
     *
     * Note: If entered numeric, it will get the key 
     * by it's offset position number. Arrays starting from 0.
     *
     * @param key The key of the item
     * @return Array item value (Either String, Integer, Object).
     */

    public function get($key)
    {
        if (!is_numeric($key))
        {
            return (isset($this->map[$key])) ? $this->map[$key] : null;
        }
        else
        {
            $values = array_values($this->map);
            return (isset($values[$key])) ? $values[$key] : null;
        }
    }
}

我想创建自己的Map类型数组类(来自Java),仅用于练习和使用。

现在我遇到了包含/删除方法的问题。

当我不使用数字删除/包含它可以正常工作,错误主要是删除。

当我通过偏移量(数字)删除项目时,我认为它不会从实际数组中删除。

好的,现在让我们调试并测试。

                $d = new Map();
                $d->add("heyy", 55);
                $d->remove(0);
                if ($d->contains(0))
                {
                    echo 5555;
                }

创建新的地图对象,添加新值,删除偏移0,检查是否存在,如果是,则echo 5555

现在,让我们做var_dump($ values [$ key]);删除后:

结果:NULL

删除前:

结果:55

现在让我们在删除后回显$ this-&gt; map(“heyy”):

结果:55

好的,现在它意味着该项目不会从数组中删除。

我尝试了什么:

            $values = array_values($this->map);
            if (isset($this->map[$values[$key]]))
            {
                unset($this->map[$values[$key]]);
            }

仍然无效。

这有什么问题?

2 个答案:

答案 0 :(得分:1)

您需要使用array_keys(),而不是array_values(),因为您需要取消设置密钥,而不是值。例如:

$map = array('abc' => 'def');
var_dump($map);
array(1) {
  ["abc"]=>
  string(3) "def"
}
$keys = array_keys($map);
if (isset($map[$keys[0]])) {
    unset($map[$keys[0]]);
}
var_dump($map);
array(0) {
}

答案 1 :(得分:0)

public function remove($key)
{
    // First convert numeric key to the actual key at that position
    if (is_numeric($key))
    {
        $keys = array_keys($this->map);
        $key = $keys[$key];
    }
    // Now remove the key
    unset($this->map[$key]);
}