2011-01-09 12 views
17

Wie kann ich den folgenden Code zum Arbeiten bekommen?PHP explode und Array Index

$ a = explodieren ('s', $ str) [0];

ich nur sehen Lösungen wie folgt aussehen:

$ a = explode ('s', $ str); $ a = $ a [0];

Antwort

31

Wie andere gesagt haben, PHP im Gegensatz zu JavaScript ist, dass es nicht Array-Elemente aus der Funktion zurückkehrt zugreifen können. Die zweite von Ihnen angegebene Methode funktioniert. Sie können auch mit den current(), reset() oder array_pop() Funktionen wie so das erste Element des Arrays greifen:

$a = current(explode('s', $str)); //or 
$a = reset(explode('s', $str)); //or 
$a = array_pop (explode('s', $str)); 

Wenn Sie möchten, um den leichten Kopf zu entfernen, die explodieren können dazu führen, aufgrund mehrerer Trennungen können Sie einstellen, seine Grenze auf 2, indem zwei nach den anderen Argumenten übergeben werden. Sie können auch die Verwendung von str_pos und strstr stattdessen in Betracht ziehen:

$a = substr($str, 0, strpos($str, 's')); 

Alle diese Möglichkeiten funktionieren.

EDIT Eine andere Möglichkeit wäre list() zu verwenden (siehe PHP doc). Mit ihm können Sie jedes Element greifen:

list($first) = explode('s', $str); //First 
list(,$second) = explode('s', $str); //Second 
list(,,$third) = explode('s', $str); //Third 
//etc. 

Das ist nicht Ihre Art? Sie können immer eine kleine Hilfsfunktion schreiben Elemente von Funktionen zu greifen, die Arrays zurückgeben:

function array_grab($arr, $key) { return($arr[$key]); } 

$part = array_grab(explode('s', $str), 0); //Usage: 1st element, etc. 

EDIT: PHP 5.4 unterstützt Array dereferencing, so Sie in der Lage sein zu tun:

$first_element = explode(',','A,B,C')[0]; 
+1

aber alles funktioniert, wenn ich das erste Element brauche, nicht die zweite – kusanagi

+1

siehe meine Beiträge für mehr auf diese und andere Weise –

2

Sie sind mit Ihrem zweiten Codeblock korrekt. explode und andere Funktionen können kein vollständig formatiertes Array zur sofortigen Verwendung zurückgeben. Daher müssen Sie eine temporäre Variable festlegen. Dazu kann Code im Entwicklungsbaum vorhanden sein, aber die einzige Möglichkeit, die benötigten Elemente zu erhalten, ist die temporäre Variable.

+0

Das ist leider richtig, und das sagt eine Menge darüber aus, wie die Sprache entworfen wird :-( –

1

Verwendung current

$a = current(explode('s', $str)); 

aber ich fand, ist hässlich

1

Sie können dies verwenden:

$a = array_shift(array_slice(explode("s", $str), 0, 1))); 

Dies ist der beste Weg, den ich gefunden habe, um ein bestimmtes Element aus einem Array von Explode zu bekommen.

Aufteilung:

  • Explode gibt einen Array auf Begrenzer
  • array_slice($arrayname, $offset, $length) Ihnen ein neues Array mit allen Artikeln Offset, Länge
  • array_shift($array) gibt Ihnen das erste (und in diesem Fall gibt, die nur) Element in dem Array, das an es übergeben wurde.

Diese doesen't hübsch aussehen, sondern macht das gleiche wie:

$a = explode('s', $str)[0]; 

Es muss ein besserer Weg, dies zu tun, aber ich habe es nicht gefunden.

Update: ich untersuchen dies, weil ich einen Teil einer URL extrahieren wollte, also habe ich die folgenden Tests:

function urlsplitTest() 
{ 

    $url = 'control_panel/deliveryaddress/188/edit/'; 
    $passes = 1000000; 

    Timer::reset(); 
    Timer::start(); 
    $x =0; 
    while ($x<$passes) { 
     $res = array_shift(array_slice(explode("/", $url), 2, 1)); 
     $x++; 
    } 
    Timer::stop(); 
    $time = Timer::get(); 
    echo $res.'<br />Time used on: array_shift(array_slice(explode("/", $url), 2,  1)):'.$time; 

    Timer::reset(); 
    Timer::start(); 
    $x =0; 
    while ($x<$passes) { 
     $res = array_get(explode("/", $url), 2); 
     $x++; 
    } 
    Timer::stop(); 
    $time = Timer::get(); 
    echo $res.'<br />Time used on: array_get(explode("/", $url), 2): '.$time; 

    Timer::reset(); 
    Timer::start(); 
    $x =0; 
    while ($x<$passes) { 
     $res = substr($url, 30, -6); 
     $x++; 
    } 
    Timer::stop(); 
    $time = Timer::get(); 
    echo $res.'<br />Time used on: substr($url, 30, -6): '.$time; 
} 

function array_get($array, $pos) {return $array[$pos];} 

Die Ergebnisse waren wie folgt:

Time used on: array_shift(array_slice(explode("/", $url), 2, 1)):7.897379 
Time used on: array_get(explode("/", $url), 2): 2.979483 
Time used on: substr($url, 30, -6): 0.932806 

In meinem Fall wollte ich die Zahl 188 von der URL bekommen, und der ganze Rest der URL war statisch, also benutzte ich die substr-Methode, aber für eine dynamische Version, in der sich lenh ändern kann, ist die obige array_get-Methode das ist schnell und sauber.