2016-08-10 7 views
0

Warum gibt dieses Array 1 anstelle von 2 zurück?Warum gibt dieses Array 1 anstelle von 2 zurück?

Sollte es nicht 2 zurückgeben?

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

echo count($join); 
+11

Weil Sie nur einen eindeutigen Schlüssel haben – Nosyara

+0

Es gibt $ join ['JOIN'] 'als den einzigen äußeren Schlüssel im Array. Sie haben zwei gesetzt, aber die zweite überschreibt sofort die erste. – Martin

+0

@Nosyara, wie kann ich dieses Array ändern, um 2 Schlüssel zu haben, ohne den Schlüsselnamen zu ändern? – William

Antwort

3

Sie schaffen eine assoziatives Array, was bedeutet, dass jedes Element asso ist mit einem eindeutigen Schlüssel verknüpft. Daher kann in einem Array jeder Schlüssel nur einmal angezeigt werden. Ein zweimal erscheinender Schlüssel bedeutet, dass der Wert überschrieben wird.

Wenn Sie versuchen, das Array var_dump, würde es diese Ausgabe haben:

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

Wie aus diesem Ergebnis zu sehen ist, nur eine Zeile vorhanden ist.

Wenn Sie 'JOIN' in jedem Element haben müssen, vielleicht möchten Sie Ihre Array-Struktur in das ändern:

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

Dies wird die Informationen 'JOIN' in jedem Element tragen. Ich kann mir jedoch nicht vorstellen, warum Sie so etwas brauchen würden.

Stattdessen vielleicht möchten Sie mehrere Elemente unter dem 'JOIN Schlüssel haben:

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

Wie pro Ihre Kommentare, vielleicht irgendwann Sie eine Struktur wie diese haben wollen:

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

Nach Ihre Kommentare, könnte es wünschenswert sein, wenn Sie dies durch objektorientierte Programmierung stattdessen tun:

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

Dann können Sie es wie folgt verwenden:

$joins = []; 

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

Weil Sie gleichen Array-Schlüssel sowohl für das Element verwenden

dies versuchen,

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

Oder mit demselben Schlüssel Versuch folgende

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

Ich sehe, was Sie durch 'JOIN1' und' JOIN2' machen wollen, dass Sie implizieren, dass sie unterschiedliche Schlüssel sein sollten. Aber wenn man bedenkt, was @William in diesem Beispiel tun möchte, scheint es die Regel zu sein, dass "wenn Sie String + Zahlen in Ihren Array-Schlüsseln sind, Sie höchstwahrscheinlich etwas falsch machen" hier gelten. – SOFe

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

echo count($join); 

wie kann ich dieses Array ändern 2 Schlüssel haben, ohne den Schlüsselnamen zu ändern?

Um zu müssen, um diesen Schlüssel nicht Namen zu ändern, macht JOIN ein Array von numerischen Werten so strukturell Sie wollen:

array: 

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

Dies kann mit dieser Syntax (geklärte für das Verständnis) erreicht werden:

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

(für eine einfache vereinfacht):

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

gibt Ihnen eine $join Array mit einer Zählung von 1, die (die) ein Array mit einer Anzahl von enthält, von denen jede Elemente enthält.

1

Ohne auf das spezifischere Problem in den Kommentaren einzugehen und zuzugeben, dass Sie bereits eine Antwort angenommen haben, die für Ihre Zwecke geeignet ist, finden Sie hier eine eher theoretische Erklärung dafür, warum Sie nicht zwei gleiche Schlüssel haben können . Dies mag für Sie nicht nützlich sein, aber hoffentlich könnte es jemandem helfen, der dieses Konzept nicht intuitiv versteht.

Unabhängig davon, ob Sie Ihren eigenen String-Schlüssel ($array = ['key' => 'value'];) zuweisen, Ihre eigenen integer Tasten zuweisen ($array = [42 => 'the answer'];), oder lassen Sie PHP Integer-Schlüssel automatisch zuweisen ($array[] = 'something';), müssen die Schlüssel eindeutig sein.

Nach the PHP manual for arrays:

ein Array in PHP ist tatsächlich ein geordnetes Karte. Eine Map ist ein Typ, der den Schlüsseln Werte zuordnet.

Die meisten Programmiersprachen haben so etwas. Diese Zuordnung von Werten zu Schlüsseln bedeutet, dass per Definition Schlüssel müssen eindeutig sein. Wenn eine Sprache es erlaubt, eine "Karte" mit mehreren identischen Schlüsseln zu erstellen, die auf unterschiedliche Werte zeigen, wäre das Nachschlagen eines Wertes nach Schlüssel unmöglich (oder würde zumindest zu mehrdeutigen Ergebnissen führen), so dass die Karte ziemlich nutzlos wäre.

PHP wird können Sie Dinge wie schreiben:

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

ohne irgendwelche Fehler zu geben, aber das Ergebnis davon wird sein:

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

wo 'a' => 3 den zuvor definierten Wert überschrieben der Schlüssel 'a'. Dadurch kann die Karte weiterhin funktionieren, so dass $example['a'] immer denselben Wert ergibt. Wenn Sie tatsächlich

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

Dann würde, was hätte das Ergebnis $example['a'] sein? Jedes definierte Verhalten (erste Instanz von 'a' usw.) würde bedeuten, dass einige Werte von 'a' nicht zugänglich wären.

+0

Verstanden, vielen Dank für die Erklärung! – William

Verwandte Themen