2016-04-21 8 views
4

Ich habe zwei Sätze von Arrays aus $_POST. Schlüssel für beide wird numerisch und die Zählung wird die gleiche sein, da sie in Paaren als Namen und Nummern kommen:Kombinieren Sie Post-Werte und entfernen Sie leere

$_POST[names] 
(
    [0] => First 
    [1] => Second 
    [2] => 
    [3] => Fourth 
) 

$_POST[numbers] 
(
    [0] => 10 
    [1] => 
    [2] => 3 
    [3] => 3 
) 

Jetzt muss ich die beiden kombinieren, aber jeder Eintrag entfernen, in denen entweder Werte fehlen.

Das Ergebnis sollte sein, so etwas wie:

$finalArray 
(
    [First] => 10 
    [Fourth] => 3 
) 

Post-Daten dynamisch erstellt wird, so könnte es verschiedene Werte fehlen, basierend auf Benutzereingaben.

Ich habe versucht, etwas zu tun, wie:

if (array_key_exists('names', $_POST)) { 
     $names = array_filter($_POST['names']); 
     $numbers = array_filter($_POST['numbers']); 

     if($names and $numbers) { 
      $final = array_combine($names, $numbers); 

     } 

    } 

Aber ich kann nicht scheinen, korrekt zu filtern, da du mir einen Fehler geben:

Warning: array_combine(): Both parameters should have an equal number of elements

+0

können wir davon ausgehen, dass beide Felder immer die gleiche Zählung haben, und dass die Schlüssel immer numerisch sein? –

+0

Ja, beide Schlüssel sind numerisch und die Anzahl ist gleich, da sie paarweise als Namen und Zahlen vorkommen. – Alko

+0

@Alko Ich habe jeder Antwort einige relevante Kommentare hinzugefügt. Sehen Sie sich die Seite an, um einige Einblicke zu erhalten, die für Sie und andere von Interesse sein könnten. – mickmackusa

Antwort

3

Wie wäre es mit array_filter mit ARRAY_FILTER_USE_BOTH Flagge auf?

<?php 
    $array1 = [ 
     0 => "First", 
     1 => "Second", 
     2 => "", 
     3 => "Fourth", 
    ]; 

    $array2 = [ 
     0 => 10, 
     1 => "", 
     2 => 3, 
     3 => 3, 
    ]; 

    var_dump(array_filter(array_combine($array1, $array2), function($value, $key) { 
     return $key == "" || $value == "" ? false : $value; 
    }, ARRAY_FILTER_USE_BOTH)); 

/* 
Output: 

array(2) { 
    ["First"]=> 
    int(10) 
    ["Fourth"]=> 
    int(3) 
} 
*/ 
+0

Dies ist nicht vertrauenswürdig, weil 'array_filter()' '0' Schlüssel/Wert Elemente abtötet. http://sandbox.onlinephpfunctions.com/code/3d5536ea2a35d83c12afd0c52ef2f3d03d7ec47d – mickmackusa

+0

Ich empfehle diese leichte Anpassung: 'var_export (array_filter (array_combine ($ array1, $ array2), funktion ($ value, $ key) { zurückgeben $ key! == "" && $ value! == ""; }, ARRAY_FILTER_USE_BOTH)); ' – mickmackusa

0

Ihre bisherigen Informationen Rechnung Takeing:

both keys will be numeric and the count will be the same, since they come in pairs as names and numbers

$myNewArray = array(); 

$count = 0; 
foreach ($_POST['names'] as $bufferArray) 
{ 
    if (($bufferArray[$count]!=NULL)&&($_POST['numbers][$count]!=NULL)) 
    { 
    array_push($myNewArray, array($bufferArray[$count] => $_POST['numbers][$count]); 
    } 
    $count++; 
} 

Lass es mich wissen, wenn das hilft! :)


Hinweis: habe ich einige Änderungen an dem Code.

Auch mein vorheriger Code überprüft, ob die leeren Array-Leerzeichen NULL sind. Wenn Sie prüfen möchten, ob sie entweder NULL oder „“ (leer) sind, ersetzen Sie dann die Codezeile mit:

if (($bufferArray[$count]!=NULL)&&($_POST['numbers][$count]!=NULL)&&($bufferArray[$count]!="")&&($_POST['numbers][$count]!="")) 
{...} 
+0

Diese Methode weist mehrere Syntaxfehler auf. Nach dem Reparieren wird die Ausgabe immer noch fehlerhaft gemacht und es kommt nicht annähernd dazu, das korrekte Ergebnis zurückzugeben. Downvoted. Testen Sie Ihren Code immer vor der Veröffentlichung, damit Sie zukünftige Leser nicht verwirren, Zeit verschwenden oder ahnungslose Forscher dazu bringen, schlechten Code zu verwenden. Arbeitsdemo der schlechten Ausgabe: http: //sandbox.onlinephpfunctions.com/code/128d6609efaa691a8ca02499316ff39370ec9028 – mickmackusa

1

Wenn beide Arrays die gleiche Zählung haben, und die Schlüssel immer numerisch sein, Sie könnte wie folgt vorgehen:

$total = count($_POST['names']); 
$final = array(); 
for ($i = 0; $i < $total; $i++) { 
    if (trim($_POST['names'][$i]) != '' && trim($_POST['numbers'][$i]) != '') { 
     $final[$_POST['names'][$i]] = $_POST['numbers'][$i]; 
    } 
} 

Oder wenn Sie ein foreach statt for

$final = array(); 
foreach ($_POST['names'] as $key => $value) { 
    if (trim($value) != '' && trim($_POST['numbers'][$key]) != '') { 
     $final[$value] = $_POST['numbers'][$key]; 
    } 
} 
+0

Diese Antwort ist "0" Schlüssel & Wert "sicher" und doppelte "Zahlen" "sicher". Ich würde diese Antwort sehr sauber nennen, wenn diese 'trim()' Aufrufe nicht da wären. Für den Umfang dieser Frage sind die 'trim()' Aufrufe nicht notwendig. Gute Antwort. Demo: http://sandbox.onlinephpfunctions.com/code/f0f517f82460b9efd27325bbd247ca912083dcbf – mickmackusa

3

Hier ist eine unterhaltsame Art und Weise zu verwenden, bevorzugen:

$result = array_flip(array_flip(array_filter(array_combine($_POST['names'], 
                  $_POST['numbers'])))); 
+0

Dies ist nicht vertrauenswürdig, weil 'array_filter()' '' 0 'wertvolle Elemente töten wird. – mickmackusa

+0

Doppeltes Umdrehen beschädigt auch die Ausgabe, wenn doppelte Zahlen in '$ _POST ['numbers']' 'vorhanden sind. http://sandbox.onlinephpfunctions.com/code/6fc1774f9ea5f804760ab0184c02a49b641e3aa8 Bitte verbessern/schreiben Sie diese Antwort, zu viel falsch damit gerade jetzt. – mickmackusa

2
// create array using $_POST['names'] as keys and $_POST['numbers'] as values 
$result = array_combine($_POST['names'], $_POST['numbers']); 
// remove entries that have empty values 
$result = array_filter($result); 
// remove entry with empty key 
unset($result[null]); 

print_r($result); 
+0

Dies ist nicht vertrauenswürdig, weil' array_filter() '' 0'-bewertete Elemente löschen wird. – mickmackusa

Verwandte Themen