2010-11-18 7 views
2

Hallo können sagen, dass ich dieses Array haben:prüfen für sich wiederholende Elemente in PHP-Array (wenn nicht leer)

$check_post = array(

$_POST["a_post"], 
$_POST["b_post"], 
$_POST["c_post"], 
$_POST["d_post"], 
$_POST["e_post"], 
$_POST["f_post"], 
$_POST["g_post"], 
$_POST["h_post"], 
$_POST["i_post"] 

); 

ich, ob Elemente dieses Arrays überprüfen möchten wiederholt werden, so dass das Beste, was ich bekam das ist:

if (count(array_unique($check_post)) < count($check_post)) 
    echo "Duplicate"; 
else 
    echo "NO Duplicate"; 

die mit Ausnahme der Tatsache, funktioniert gut, dass, wenn mehr als ein Textfeld leer gelassen wird (was erlaubt ist) es gibt mir FALSCH.

Was ich will, ist nicht für den habe ich mit empty() und mit array_values($check_post) versucht (count(array_unique())

BTW die leeren Werte des Arrays zu betrachten, aber ich kann nicht drum herum kommen.

Vielen Dank im Voraus! bitte erkundigen Sie sich nach der notwendigen Klärung.

Antwort

8

Um alle leeren Werte aus dem Vergleich zu entfernen Sie array_diff() hinzufügen:

if (count(array_unique(array_diff($check_post,array("")))) < count(array_diff($check_post,array("")))) 
+0

Ich werde es versuchen! Vielen Dank!! – Trufa

+0

Ich denke, OP will Leergut zur linken Menge beitragen, aber nicht das richtige –

+0

Dann wird er immer "Duplizieren" bekommen, wenn es leere Werte gibt. Ich glaube nicht, dass er das wollte. – AndreKR

1
if (count(array_unique(array_filter(function(x) {return !empty(x)}, $check_post)) < count($check_post)) 
    echo "Duplicate"; 
else 
    echo "NO Duplicate"; 
2

Gut so, wie Sie es ist in Ordnung haben, obwohl, wie Sie sagen, Sie eine Notwendigkeit, die leer zu entfernen Einträge zuerst.

$non_empty_check_post = array_filter($check_post, create_function('$item', 'return !empty($item);'); 

if (count(array_unique($non_empty_check_post)) < count($non_empty_check_post)) { 
    echo "Duplicate"; 
} else { 
    echo "NO Duplicate"; 
} 
+2

+1. Es ist jedoch nicht notwendig, eine Callback-Funktion für 'array_filter' bereitzustellen, wenn Sie Leerzeichen (oder Einträge, die zu' false' auswerten) entfernen möchten. Manual sagt "Wenn kein Callback angegeben wird, werden alle Eingaben von FALSE entfernt. ":) – netcoder

+0

@netcoder Sehr wahr! array_filter ($ check_post) wäre ausreichend. – Orbling

2

Filter aus den Rohlingen aus dem Array:

function no_blanks($val) { 
    // Do not use empty() here if you don't consider the string "0" as blank 
    return trim($val) !== ''; 
} 

$check_post = array_filter($check_post, 'no_blanks'); 

if (count(array_unique($check_post)) < count($check_post)) 
    echo "Duplicate"; 
else 
    echo "NO Duplicate"; 
+0

+1. Es ist jedoch nicht notwendig, eine Callback-Funktion für "array_filter" bereitzustellen, wenn Sie Leerzeichen (oder Einträge, die zu "false" auswerten) entfernen möchten. Das Handbuch sagt "Wenn kein Callback angegeben wird, werden alle Eingaben von FALSE gelöscht." :) – netcoder

+0

@netcoder: Mein Callback prüft nur die leere Zeichenkette streng, da Zeichenketten mit der Ziffer Null ebenfalls von 'array_filter()' gelöscht werden, was gegen die Absichten von OP verstößt. Ich habe 'array_filter()' in einer anderen Antwort verwendet, die ich vorher gepostet habe :) – BoltClock

+0

Ah, ich sehe was du hier gemacht hast. Macht Sinn! – netcoder