Hallo allerseits, seit der Veröffentlichung des ersten Teils ist fast ein Jahr vergangen . Die Diskussion in den Kommentaren war heiß, ich zog Schlussfolgerungen für mich selbst, nahm fast sofort Änderungen an der Bibliothek vor, aber es war keine Zeit, darüber zu schreiben.
Kürzlich habe ich die Funktionalität mit einigen Methoden erweitert und möchte diese Neuigkeiten mit Ihnen teilen.
Und natürlich werde ich über die Arbeit an Fehlern schreiben.
Für diejenigen, die nicht wussten und vergessen haben, was ein ArrayHandler ist
Spoiler
Beantworten wir die Frage: "Was ist typsicheres Arbeiten mit Arrays in PHP?"
Typ sicher ist:
;
;
, , - . , :
$a = 0;
if (key_exists($key, $collection))
{
$a = (int) $collection[$key];
}:
$a = (int) $collection[$key] ?? 0;, " ".
Zusätzlich zu diesen drei Vorteilen bietet ArrayHandler Unveränderlichkeit, dh wir können unseren ArrayHandler sicher durch Abstraktionsebenen führen, und niemand wird versehentlich die Elemente innerhalb des ursprünglichen Arrays ändern. Um den Wert zu ändern, müssen Sie eine neue Instanz von ArrayHandler erstellen. Dies ist bei der Codeüberprüfung schwieriger zu überspringen als das Schreiben eines neuen Werts in ein Array-Element.
Ich werde keine Beispiele für die Arbeit kopieren und einfügen. Sie können sie im ersten Teil sehen oder die Dokumentation lesen .
Liba wird über Composer installiert:
composer require sbwerewolf/language-specificEs gibt Versionen für PHP 5.6 / 7.0 / 7.2.
Es war jetzt eine lange Einführung auf den Punkt.
Aktualisierung
Vor ein paar Tagen war ich sowohl traurig als auch gelangweilt. Ich wollte etwas Gutes tun, zum Beispiel, damit Sie beim Durchlaufen der Elemente mit foreach () nicht nur das Element (ValueHandler), sondern auch den Index dieses Elements erhalten.
Ich habe mit Begeisterung gearbeitet und nachdem ich bereits Tonnen von Code geschrieben hatte, stieß ich auf einen Kommentar in der PHP-Dokumentation, der den gesamten neuen Code unbrauchbar machte.
Es stellt sich heraus, dass Sie dies tun können:
yield $key => $value;Und foreach () gibt den Index des Elements zurück. Eureka!
Jetzt gibt IArrayHandler :: pull () sowohl den neuen IArrayHandler vom Array-Element als auch den Index dieses Elements zurück. Ich war glücklich, es scheint, dass ArrayHandler jetzt eine ideale Bibliothek für die Arbeit mit Arrays geworden ist (wie ich am Anfang des Artikels angegeben habe).
. - IArrayHandler::getting(), Iterator ArrayHandler foreach() .
IArrayHandler::pulling() ArrayHandler ( , ). "pulling" - IArrayHandler::pull(), ArrayHandler .
IArrayHandler::getting() IValueHandler , . "getting" - IArrayHandler::get(), IValueHandler .
IArrayHandler::pulling() , IArrayHandler::getting() .
:
$data = new ArrayHandler(
[
'first' => ['A' => 1],
'next' => ['B'=>2],
'last' => ['C'=>3],
4=>[5,6],
7,
8,
9
]);
echo 'arrays'.PHP_EOL;
foreach ($data->pulling() as $key => $value) {
echo "[$key] => class is ".get_class($value).' '.PHP_EOL;
}
echo 'values'.PHP_EOL;
foreach ($data->getting() as $key => $value) {
echo "[$key] => {$value->asIs()} , class is ".get_class($value).' '.PHP_EOL;
}:
arrays
[first] => class is LanguageSpecific\ArrayHandler
[next] => class is LanguageSpecific\ArrayHandler
[last] => class is LanguageSpecific\ArrayHandler
[4] => class is LanguageSpecific\ArrayHandler
values
[5] => 7 , class is LanguageSpecific\ValueHandler
[6] => 8 , class is LanguageSpecific\ValueHandler
[7] => 9 , class is LanguageSpecific\ValueHandler, foreach():
$data = new ArrayHandler(
[
'first' => ['A' => 1],
'next' => ['B'=>2],
'last' => ['C'=>3],
4=>[5,6],
7,
8,
9
]);
echo 'ALL'.PHP_EOL;
foreach ($data as $key => $value) {
$type = gettype($value->asIs());
echo "[$key] => value type is $type , class is ".get_class($value).PHP_EOL;
}:
ALL
[first] => value type is array , class is LanguageSpecific\ValueHandler
[next] => value type is array , class is LanguageSpecific\ValueHandler
[last] => value type is array , class is LanguageSpecific\ValueHandler
[4] => value type is array , class is LanguageSpecific\ValueHandler
[5] => value type is integer , class is LanguageSpecific\ValueHandler
[6] => value type is integer , class is LanguageSpecific\ValueHandler
[7] => value type is integer , class is LanguageSpecific\ValueHandler, , , foreach(), :
foreach ($data as $key => $value) {
/* @var \LanguageSpecific\ValueHandler $value */
if($value->type() === 'array'){
$handler = new ArrayHandler($value->array());
/* some code */
}
}IValueHandler::default() , @GreedyIvan, , .
ArrayHandler::simplify() ,
ArrayHandler->simplify(), array_column? (c) @olegmar
C @olegmar.
Die IArrayHandler :: next () -Methode wurde durch IArrayHandler :: pull () ersetzt. Diese Methode durchläuft alle verschachtelten Arrays (erste Verschachtelungsebene). Nicht dass mich der Kommentar von @Hett direkt überzeugt hätte, sondern mich zum Nachdenken gebracht hätte.
Danke @ ReDev1L für die Unterstützung in den Kommentaren.
Die IArrayHandler :: raw () -Methode wurde hinzugefügt, um das ursprüngliche Array zu erhalten. Früher, als es nicht möglich war, den Index eines Elements abzurufen, musste über das ursprüngliche Array iteriert werden. Aus Erfahrung ist es nun erforderlich, Array-Elemente hinzuzufügen / zu subtrahieren und einen neuen ArrayHandler aus dem geänderten Array zu erstellen.
Das ist alles. Danke fürs Lesen.