【问题标题】:What are the differences of Array and Hash in PHP?PHP中的Array和Hash有什么区别?
【发布时间】:2010-10-27 12:16:54
【问题描述】:

数组和哈希 PHP 有什么区别?

一个数组:array(1,2,3...)
一个哈希:array(key1=value1, key2=value2, ...)

它们是不同的还是相同的?

※ 例如,函数参数允许数组对哈希有效吗?

因为我用传统语言区分并使用它,所以我感到困惑。

【问题讨论】:

    标签: php arrays hash language-comparisons


    【解决方案1】:

    您所描述的都是数组。两者之间的唯一区别是您为第二个显式设置密钥,因此它们被称为associative arrays。我不知道您从哪里获得哈希术语(Perl?),但这不是它们在 PHP 中所指的。

    例如,如果您要这样做:

    $foo = array(1,2,3,4,5);
    print_r($foo);
    

    输出将是:

    Array
    (
        [0] => 1
        [1] => 2
        [2] => 3
        [3] => 4
        [4] => 5
    )
    

    如您所见,访问您输入的各个值的键是为您创建的,但仍然存在。所以这个数组本质上也是关联的。数组的另一种“类型”完全相同,只是您明确地说“我想用 this 键访问 this 值”而不是自动数字索引(尽管您提供的密钥也可以是数字)。

    $bar = array('uno' => 'one', 'dos' => 'two');
    print_r($bar);
    

    会输出:

    Array
    (
        [uno] => one
        [dos] => two
    )
    

    如您所料,执行print $bar['one'] 将输出uno,而执行第一个示例中的$foo[0] 将输出1

    就函数而言,PHP 函数在大多数情况下会采用这些数组“类型”中的任何一种,然后执行您希望它们执行的操作,但有一些区别需要注意,因为有些函数会做一些时髦的事情到你的索引,有些不会。通常最好在使用数组函数之前阅读文档,因为它会注意到输出将取决于数组的键。

    您应该read the manual 了解更多信息。

    【讨论】:

    • “驱动” php 数组的内部数据类型称为 HashTable。
    【解决方案2】:

    实际上,php 中没有数组——只有关联数组(基本上是一个哈希表)

    试试看

    $ar=array("zero","one","two","three","four");
    unset($ar[3]);
    

    这样做会从数组中删除“三个”,但您会注意到数组键(数组不是关联的)将保持不变 (0,1,2,4) - 在任何普通语言中它都会将“四”的键重新编号为 3。

    【讨论】:

      【解决方案3】:

      在引擎 php 中,所有数组(关联或顺序)都是哈希表,这是因为它是读取单个元素的最快方法。内部有创建和填充数组的基本函数:

      int zend_hash_init(HashTable *ht, uint nSize,hash_func_t pHashFunction, dtor_func_t pDestructor, zend_bool persistent);
      
      int zend_hash_add(HashTable *ht, char *arrKey, uinit nKeySize, void *pData, uinit nDataSize, void **pDest)
      
      int zend_hash_update(HashTable *ht, char *arrKey, uinit nKeySize, void *pData, uinit nDataSize, void **pDest)
      
      int zend_hash_index_update(HashTable *ht, ulong h, void *pDate, uinit nDataSize, void **pDest)
      
      int zend_hash_next_index_insert(HashTable *ht, void *pData, uinit nDataSize, void **pDest)
      
      int zend_hash_add(HashTable *ht, char *arrKey, uinit nKeySize, void *pData, uinit nDataSize, void **pDest)
      
      int zend_hash_update(HashTable *ht, char *arrKey, uinit nKeySize, void *pData, uinit nDataSize, void **pDest)
      
      int zend_hash_index_update(HashTable *ht, ulong h, void *pDate, uinit nDataSize, void **pDest)
      
      int zend_hash_next_index_insert(HashTable *ht, void *pData, uinit nDataSize, void **pDest)
      

      ......

      【讨论】:

        猜你喜欢
        • 2014-11-20
        • 1970-01-01
        • 1970-01-01
        • 2016-12-03
        • 2017-06-28
        • 1970-01-01
        • 2011-12-31
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多