为什么这个数组计数返回1而不是2?

时间:2016-08-10 17:52:33

标签: php arrays

为什么此数组计数返回1而不是2?

它不应该返回2吗?

$join = [
   'JOIN' => ['coins','users.id','user_id'],
   'JOIN' => ['coins','users.id','user_id']
];

echo count($join);

4 个答案:

答案 0 :(得分:3)

您正在创建关联数组,这意味着每个元素都与一个唯一键相关联。因此,在数组中,每个键只能出现一次。出现两次的密钥意味着该值将被覆盖。

如果您尝试var_dump数组,它将具有此输出:

array(1) {
  ["JOIN"]=>
  array(3) {
    [0]=>
    string(5) "coins"
    [1]=>
    string(8) "users.id"
    [2]=>
    string(7) "user_id"
  }
}

从这个结果可以看出,只存在一行。

如果你需要在每个元素中都有'JOIN',也许你想将数组结构改为:

$join = [
   ['JOIN' => ['coins','users.id','user_id']],
   ['JOIN' => ['coins','users.id','user_id']]
];

这将在每个元素中包含信息'JOIN'。但是,我无法想象为什么你需要这样的东西。

相反,也许你想在'JOIN键下有多个元素:

$join = [
    'JOIN' => [
        ['coins','users.id','user_id'],
        ['coins','users.id','user_id']
    ]
];

根据您的评论,也许您最终希望拥有这样的结构:

$join = [
    'JOIN' => [
        ['coins','users.id','user_id'],
        ['coins','users.id','user_id'],
    ],
    'INNER JOIN' => [
        ['coins','users.id','user_id'],
        ['coins','users.id','user_id'],
    ]
];

根据您的评论,如果您通过面向对象的编程来实现这一点可能更为可取:

class Join{
    const JOIN = 0;
    const INNER_JOIN = 1;
    // we are using constants to prevent bugs caused by typos
    public $type;
    public $coins;
    public $usersDotId; // I don't really know what you are trying to do here
    public $userId;
}

然后你可以像这样使用它:

$joins = [];

$join = new Join();
$join->type = Join::INNER_JOIN;
$join->coins = "some_value";
$join->usersDotId = "some_value";
$join->userId = "some_value";
$joins[] = $id;

答案 1 :(得分:2)

$join = [
   'JOIN' => ['coins','users.id','user_id'],
   'JOIN' => ['coins','users.id','user_id']
];

echo count($join);
     

如何在不更改密钥名称的情况下修改此数组以获得2个密钥?

为了不需要更改此密钥名称,请在结构上使JOIN成为一个数值值数组:

array:

 ----> [Join] :
          \---> [0] 
                 \--->   coins
                 |--->   users.id
                 |--->   user.id

这可以通过这种语法实现(为了理解而澄清):

$join = [
   'JOIN' => [0] => ['coins','users.id','user_id'],
             [1] => ['coins','users.id','user_id']
];

(为了方便而简化):

$join = [
       'JOIN' =>  ['coins','users.id','user_id'],
                  ['coins','users.id','user_id']
    ];

为您提供一个计数为1的$join数组,其中包含(一个)计数为 2 的数组,每个数组包含 3 元素。

答案 2 :(得分:1)

如果没有解决评论中出现的更具体的问题,并且承认您已经接受了适用于您的目的的答案,那么这里有一个更为理论上的解释,说明为什么您不能拥有两个相同的密钥。这可能对你没用,但希望它可以帮助那些没有直观地理解这个概念的人。

无论你是否分配自己的字符串键($array = ['key' => 'value'];),分配自己的整数键($array = [42 => 'the answer'];),或让PHP自动分配整数键($array[] = 'something';),键必须是独一无二的。

根据the PHP manual for arrays

  

PHP中的数组实际上是一个有序的映射。映射是将值与键关联的类型。

大多数编程语言都有这样的东西。这种值与键的关联意味着按照定义,键必须是唯一的。如果一种语言允许你创建一个“地图”,其中多个相同的键指向不同的值,那么按键查找值是不可能的(或者至少会产生模糊的结果),因此地图将毫无用处。

PHP 让您编写如下内容:

$example = [
   'a' => 1,
   'b' => 2,
   'a' => 3,
];
var_dump($example);

没有给出任何错误,但结果将是:

array (size=2)
  'a' => int 3
  'b' => int 2

其中'a' => 3已覆盖先前定义的'a'键值。这允许地图继续工作,因此$example['a']将始终产生相同的值。如果你真的可以

array (size=3)
  'a' => int 1
  'b' => int 2
  'a' => int 3

然后$example['a']的结果是什么?任何已定义的行为('a'的第一个实例等)都意味着'a'的某些值将无法访问。

答案 3 :(得分:0)

因为您对元素

使用相同的数组键

试试这个,

<?php
$join = [
   'JOIN1' => ['coins','users.id','user_id'],
   'JOIN2' => ['coins','users.id','user_id']
];
echo count($join);
?>

或使用相同的密钥尝试以下

$join = [
   ['JOIN' => ['coins','users.id','user_id']],
   ['JOIN' => ['coins','users.id','user_id']]
];