Komplette Zeile aus Array entfernen, wenn Wert in einer Spalte öfter als 1x vorkommt

@querytail: Dann heißt das, dass du eine PHP-Version verwendest, die älter ist als PHP 5.3. Warum verwendest jemand so etwas überhaupt noch? Alternativ versuche folgendes:
PHP:
function tmp_func1 (array $item)
{
  global $unique_values;
  
  if (in_array($item[1], $unique_values))
  {
    return false;
  }
  else
  {
    array_push($unique_values, $item[1]);
    return true;
  }
}

$unique_values = array();

$result = array_filter($myfields, 'tmp_func1');
 
Was heißt du kommst nicht ran?

Gibt var_dump($fields[1]) denn das erwartete Ergebnis?

Doch, aber ich muss doch über $myfields ausgeben, sonst wirkt doch array_unique nicht.


@einfach nur crack

Sorry, das geht bei mir auch nicht. Aber es stimmt, die Version ist 5.28 . Da bin ich von meinem Provider abhängig.
 
Also dann mal generell... ich glaube wir reden etwas aneinander vorbei.

Du hast ein Array, dass du mit file() aus einer TXT-Datei erzeugst.
Du hast bestimmte Werte in jeder Zeile/jedem Element des Arrays.
Du trennst jede Zeile an einem trennzeichen auf und hast dann ein neues array(1) mit den einzelnen Werten. Darauf wendest du array_unique an und vergleichst das bereinigte Array(2) mit dem alten(1). Stimmen die Anzahl der Elemente überein, kann die zeile bleiben, wenn nicht, Zeile löschen ;)

Musst du nurnoch programieren jetzt :P
 
Was ich dabei nicht verstehe:

PHP:
$myfields[] = rtrim($fields[0]);
        $myfields[] = rtrim($fields[1]); 
        $myfields[] = rtrim($fields[2]);

Mit obigem schreibe ich die Werte in ein Array. Dann wird array_unique angewendet. Wo sind die Felder rtrim($fields[1]); rtrim($fields[2]);. Die werden nämlich nicht angezeigt mit print_r.

Ich glaub ich geb`s auf. HILFEEE ******:rolleyes:
 
Mögliche Ursache:

$fileds[1] und [2] existiert garnicht; mach mal eine testausgabe
Die drei werte sind identisch und werden deshalb von array_unique herausgefiltert
 
Du hast ein Tab-getrennte Listendatei.
Siehe auch http://www.tutorials.de/php/388580-tab-getrennte-txt-auslesen-und-bestimmte-teile-ausgeben.html

Für deine Frage habe ich kurz eine Funktion geschrieben
PHP:
/**
 * array_unique über ein Element eines Array
 * @param     Array<Key => Array<Node>>   Ein mehrstufiger Array
 * @param     String
 * @param     Integer
 * @return    Array<Key => Array<Node>>   
 */
function array_unique_by_subitem($array, $key, $sort_flags  = SORT_STRING){
    $items = array();
    // Die Subeitems auslesen
    foreach($array as $index => $item) $items[$index] = $item[$key];
    //Die Subitems mit array_unique beabreiben
    $uniqueItems = array_unique($items, $sort_flags);
    //Der eigentliche Array über den Key mit den selektierten Subitems abgleichen
    return array_intersect_key($array, $uniqueItems); 
}

Ich habe hier mal ein Beispiel dazu.
data.txt:
Code:
1	abc	2
2	def	3
3	abc	12
4	ghi	0

Der Code:
PHP:
//den tabulator als Trennzeiche definieren
define('C_DELIM', "\t");

//Zeilen einlesen
$lines = file('data.txt');

//Leere Zeilen ausfiltern. lineFilter: siehe Funktion am Schluss vom Code
$lines = array_filter($lines, 'lineFilter');

$rows=array();
foreach($lines as $line){
    //Die Zeile in die Felder aufteilen und jedes Feld noch mit trim() auf die wirkliche Grösse kürzen
    $rows[] = array_map('trim', explode(C_DELIM, $line));
}

//Unique nach Feld 2 (Feld-Index=1)
$rows = array_unique_by_subitem($rows, 1);

var_dump($rows);

//=== Verwendete Funktionen ===

/**
 * array_unique über ein Element eines Array
 * @param     Array<Key => Array<Node>>   Ein mehrstufiger Array
 * @param     String
 * @param     Integer
 * @return    Array<Key => Array<Node>>   
 */
function array_unique_by_subitem($array, $key, $sort_flags  = SORT_STRING){
    $items = array();
    // Die Subeitems auslesen
    foreach($array as $index => $item) $items[$index] = $item[$key];
    //Die Subitems mit array_unique beabreiben
    $uniqueItems = array_unique($items, $sort_flags);
    //Der eigentliche Array über den Key mit den selektierten Subitems abgleichen
    return array_intersect_key($array, $uniqueItems); 
}

/**
 * Zeilenfilter. Wenn die getrimmte Zeile keine Länge mehr hat - ignorieren 
 * @param    String        Zeile
 * @return   Boolean       Flag ob die Zeile gültig ist oder nicht
 */
function lineFilter($line){
    return (strlen(trim($line)) > 1);
}

ergibt (Zeile 3 (Feld-Index=2) ist ausgefiltert da sie ebenfalls 'abc' lautet)
Code:
Array
(
    [0] => Array
        (
            [0] => 1
            [1] => abc
            [2] => 2
        )

    [1] => Array
        (
            [0] => 2
            [1] => def
            [2] => 3
        )

    [3] => Array
        (
            [0] => 4
            [1] => ghi
            [2] => 0
        )

)

Nachtrag:
Habe mir die Freiheit genommen, diese Funktion in mein Wiki einzutragen:
PHP array_unique_by_subitem()
 
Hallo,

ich bin im Moment im Büro und kann mir Dein Werk erst heute Abend anschauen, bzw. testen.

Ich weiß aber schon jetzt, dass es funktioniert. War noch nie anders.

Vielen Dank dafür.

Grüße

querytail
 
Wie ich es schon geschrieben hatte: Es funktioniert über die gesamten Zeilen. Aber wie komme ich jetzt an die Werte aus Zeile 0, 1 und 2?

PHP:
$myfields[] = rtrim($fields[0]);
        $myfields[] = rtrim($fields[1]); 
        $myfields[] = rtrim($fields[2]);
 
Zurück