PHP - explode in mehrere arrays

Tone

beobachtet
Registriert
20 Juli 2013
Beiträge
300
Hi,
ich wollte fragen ob man eine Variable mit explode in mehrere arrays speichern kann, welche sich nach dem letzten definierten array wiederholen und hochzählen.

Also ich habe z.B.:

[src=php]
$data = "foo:*:1023:1000:hi;
list($user[$i], $pass[$i]) = explode(":", $data);
[/src]

und möchte als Ergebnis:

[src=php]
user[0]==foo
pass[0]==*
user[1]==1023
pass[1]==1000
user[2]==hi
[/src]


Ich könnte es mir natürlich auch in nur einen array ausgeben lassen und dann sagen jeder 2. Wert kömmt in $pass, dass fand ich jetzt aber erstmal nicht so schön und wollte mich mal erkundigen ob es dafür noch eine vorgesehene, schönere Variante gibt.

Danke :)
 
Grundsätzlich könntest Du das mithilfe einer Schleife machen, die jedes zweite Element aus dem Array nimmt und dessen Nachfolger als Passwort annimmt.

Die Frage ist aber, wieso Du überhaupt derart seltsam strukturierte Daten hast und ob es überhaupt Sinn macht, User und Passwörter in unterschiedlichen Arrays zu speichern.
 
  • Thread Starter Thread Starter
  • #3
Es geht nicht um User und Passwörter, das ist reiner Beispielcode.
Nichts desto trotz hast du aber recht das es seltsam strukturiert ist, lässt sich in dem Fall aber leider nicht ändern, da die Variable die ich auslesen möchte nicht von mir ist und ich auch nicht verändern kann. Ich ergänze nur etwas bestehendes.

Aber wie kann ich das mit der Schleife realisieren? Er fängt ja bei jeden list-Befehl von vorne an, dann hätte ich ja immer nur die ersten 2 Werte.

EDIT: Achso, du sprichst glaube von der selben Variante die mir auch schon in meinen Startpost als Idee kam^^
 
OK, dann lassen sich zumindest die Ursprungsdaten wirklich nicht verändern.

Um Deine gewünschten Daten zu berechnen, kannst Du das tun:

PHP:
Expand Collapse Copy
$array = explode(':', $data);

$users = array();
$passes = array();

for($i = 0; $i < count($array); $i = $i + 2){
	$users[] = $array[$i];
	if($i + 1 < count($array)){
		$passes[] = $array[$i + 1];
	}
}

print_r($users);
print_r($passes);

Ausgabe:
Code:
Expand Collapse Copy
Array
(
    [0] => foo
    [1] => 1023
    [2] => hi
)
Array
(
    [0] => *
    [1] => 1000
    [2] => a
)

Aber wie gesagt, schöner wäre es doch, wenn Du alle Daten zusammen in einem Array hättest. Beispiel:

PHP:
Expand Collapse Copy
$array = explode(':', $data);

$users = array();

for($i = 0; $i < count($array) - 1; $i = $i + 2){
	$users[] = array(
		'name' => $array[$i],
		'pass' => $array[$i + 1],
	);
}

print_r($users);

Ausgabe:

Code:
Expand Collapse Copy
Array
(
    [0] => Array
        (
            [name] => foo
            [pass] => *
        )

    [1] => Array
        (
            [name] => 1023
            [pass] => 1000
        )

    [2] => Array
        (
            [name] => hi
            [pass] => a
        )

)
 
  • Thread Starter Thread Starter
  • #5
Ok also direkt in explode ist sowas nicht vorgesehen.


Aber ich stimme dir zu, alles in ein Array ist wirklich schöner.
Danke für die umfangreichen Codebeispiele, dabei ist es mir erstmal richtig aufgefallen, dass ein mehrdimensionales Array hier viel sinnvoller ist.
Ich weiß solche Funktionen immer erst zu schätzen wenn sie mir mal richtig geholfen hat und mehrdimensionale hab ich bis jetzt noch nicht so oft verwendet. Also danke dafür :)
 
praktische Funktion: array_chunk
PHP:
Expand Collapse Copy
$input = 'foo:bar:x:y';
$delimiter = ':';
$size = 2;

$output = array_chunk(explode($delimiter, $input), $size);
PHP:
Expand Collapse Copy
$output == array(
  0 => array(
    0 => 'foo',
    1 => 'bar'
  ),
  1 => array(
    0 => 'x',
    1 => 'y'
  ),
)

mit map und combine wandern die keys hinein:

PHP:
Expand Collapse Copy
$input = 'foo:bar:x:y';
$delimiter = ':';
$keys = array('name', 'pass');

$output = array_map(
  function($values) use ($keys) { return array_combine($keys, $values); },
  array_chunk(explode($delimiter, $input), count($keys))
);

PHP:
Expand Collapse Copy
$output == array(
  0 => array(
    'name' => 'foo',
    'pass' => 'bar'
  ),
  1 => array(
    'name' => 'x',
    'pass' => 'y'
  )
)

Lang lebe λ :D
 
Zuletzt bearbeitet:
  • Thread Starter Thread Starter
  • #7
Cool danke, so eine Funktion hatte ich ursprünglich gesucht!
 
Zurück
Oben