2016-10-09 3 views
-4

Ich frage mich, ist es möglich, die folgende Array zu konvertieren:PHP explodieren in Array

Array (
    "2016-03-03 19:17:59", 
    "2016-03-03 19:20:54", 
    "2016-05-03 19:12:37" 
) 

In diese:

Array (
    "2016-03-03", 
    "2016-03-03", 
    "2016-05-03" 
) 

Ohne irgendwelche Schleifen zu schaffen?

+5

Ich werde die offensichtliche Frage stellen. Was ist los mit Loops ....? –

+4

* "Ohne irgendwelche Schleifen zu erstellen?" * ** NEIN. ** Am Ende müssen Sie jedes Array-Element ändern, so dass Sie das Array durchlaufen müssen. Suchen Sie einfach, wie Sie ein Datumsformat in ein anderes Format konvertieren und wie Sie eine Funktion auf jedes Array-Element anwenden. – Rizier123

+2

eine ungerade Anzahl von Fragen fragen: wie zu tun, X ohne (einfügen grundlegende PHP \ Programmierung Begriff \ Funktion hier) – nogad

Antwort

9

Es gibt keine expliziten Schleifen, wenn Sie array_map verwenden können, obwohl es intern Schleifen:

function format_date($val) { 
    $v = explode(" ", $val); 
    return $v[0]; 
} 
$arr = array_map("format_date", $arr); 

Vom PHP Manual:

array_map() gibt ein Array alle Elemente array1 enthält nach der Anwendung die callback Funktion zu jedem. Die Anzahl der Parameter, die die Funktion callback akzeptiert, sollte mit der Anzahl der an die array_map() übergebenen Arrays übereinstimmen.

Auch wenn Sie mit Daten zu tun haben, ist der richtige Weg zu tun, wie folgt:

return date("Y-m-d", strtotime($val)); 

Der einfache Weg ist Schleifen mit einem foreach() zu verwenden:

foreach($arr as $key => $date) 
    $arr[$key] = date("Y-m-d", strtotime($date)); 

Dies ist die einfachste Art und Weise, wie ich die index als etwas betrachten kann.


Eingang:

<?php 
$arr = array(
    "2016-03-03 19:17:59", 
    "2016-03-03 19:20:54", 
    "2016-05-03 19:12:37" 
); 
function format_date($val) { 
    $v = explode(" ", $val); 
    return $v[0]; 
} 
$arr = array_map("format_date", $arr); 

print_r($arr); 

Ausgabe

Array 
(
    [0] => 2016-03-03 
    [1] => 2016-03-03 
    [2] => 2016-05-03 
) 

Demo: http://ideone.com/r9AyYV

+0

Hm, ein Aufruf an 'explode()' mit nur einem Argument? – arkascha

+0

@arkascha Aktualisiert. Entschuldigung und danke. –

+2

Obwohl dies immer noch Loops intern ich würde erwarten, ich nehme an, solange OP sie nicht sehen können, werden sie nichts dagegen haben: P –

2

Ja, uns e Karte:

function first10($s) { 
    return substr($s, 0, 10); 
} 

$result = array_map("first10", $yourArray); 

WARNUNG: dies eine gute Lösung ist nur, wenn Sie sicher sind, dass das Datumsformat ändert die ersten 10 Zeichen mit anderen Worten nicht, muss das Datum enthalten.

+0

Kein guter Weg, was, wenn die ersten 10 nicht der richtige Wert waren? –

+1

@PraveenKumar Validierung ist nicht Gegenstand einer Frage – zerkms

+1

@PraveenKumar Danke, ich habe eine Warnung hinzugefügt, damit er weiß, wo die Grenzen dieser Lösung sind. – pid

1

Praveen Kumar's answer ist wahrscheinlich die bessere Lösung, aber es gibt eine Möglichkeit, mit etwas zu tun, was nicht wirklich als Schleife gesehen wurde. stattdessen verwenden Sie recursion

function explodeNoLoop($array,$delim,$index=0) 
{ 
    $returnArr = array(); 
    if(isset($array[$index])) 
    { 
     $expldoed = explode($delim,$array[$index]); 
     array_push($returnArr,$expldoed[0]); 
    } 
    if(isset($array[$index+1])) 
    { 
     $returnArr = array_merge($returnArr,explodeNoLoop($array,$delim,$index+1)); 
    } 
    return $returnArr; 
} 

$myArr = array (
    "2016-03-03 19:17:59", 
    "2016-03-03 19:20:54", 
    "2016-05-03 19:12:37" 
); 

var_dump(explodeNoLoop($myArr," ")); 

example

Wie dieser Code funktioniert, ist, dass mit der Funktion, die wir das Array am Index der Funktionsparameter und fügen Sie dies in unserer Rückkehr-Array zur Verfügung gestellt explodieren. Dann prüfen wir, ob am nächsten Index, der +1 des Indexes ist, der an die Funktion übergeben wurde, ein Wert gesetzt ist.Wenn es existiert, rufen wir die Funktion erneut mit dem neuen Index mit dem gleichen Array und Delimiter auf. Wir verbinden dann die Ergebnisse mit unserem Rückkehrer-Array und geben das dann zurück.

Allerdings sollte man vorsichtig sein mit nest level errors, wo Sie eine Funktion zu oft, wie ein Blick in die Reflexion eines Spiegels in einem Spiegel aufrufen.

+1

Woooooaaah !!! Beeindruckend! Aber Rekursion scheint für die aktuelle Situation ein Overkill zu sein. LoL. Wir denken kreativ. –

Verwandte Themen