William William - 3 months ago 10
PHP Question

Why is this array count returning 1 instead of 2?

Why is this array count returning 1 instead of 2?

Shouldn't it retun 2?

Code:

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

echo count($join);

Answer

You are creating an associative array, which means that each element is associated to one unique key. Therefore, in an array, each key can only appear once. A key appearing twice means that the value will be overwritten.

If you try to var_dump your array, it would have this output:

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

As seen from this result, only one line exists.

If you need to have 'JOIN' in every element, maybe you want to change your array structure into this:

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

This will carry the information 'JOIN' in every element. However, I cannot imagine why you would need such a thing.

Instead, maybe you want to have multiple elements under the 'JOIN key:

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

As per your comments, maybe you eventually want to have a structure like this:

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

Read this documentation example for further information about initializing arrays: Initializing an array

According to your comments, it might be more desirable if you do this through object-oriented programming instead:

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

Then you can use it like this:

$joins = [];

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