Einzelnen Beitrag anzeigen
  #4 (permalink)  
Alt 06-01-2015, 14:27
Benutzerbild von fireweasel fireweasel
 Registrierter Benutzer
Links : Onlinestatus : fireweasel ist offline
Registriert seit: Sep 2008
Ort: At home
Beiträge: 851
fireweasel wird schon bald berühmt werdenfireweasel wird schon bald berühmt werden
fireweasel eine Nachricht über AIM schicken fireweasel eine Nachricht über Yahoo! schicken
Standard

Zitat:
Zitat von combie Beitrag anzeigen
Das geht in einem Rutsch!

Das Zauberwort ist array_filter()
Nicht wirklich, denn array_filter() erzeugt eine Kopie des Ausgangs-Arrays, in der bestimmte Einträge des Ausgangs-Arrays enthalten sind. Der OP wollte aber im Ausgangs-Array einen bestimmten Eintrag finden und löschen.

Zitat:
Zitat von wspl Beitrag anzeigen
Hallo zusammen,

ich habe ein mehrdimensionales Array (siehe nachfolgend) und suche eine Funktion, die mir ausgibt, in welcher Zeile ein bestimmter Wert - zum Beispiel: 1420484634 - steht.

...

PHP-Code:
$fahrten = array(
array(
"code" => 1420484575"datum" => 20150107"strecke" => "PL->A""vorname" => "Thomas"),
array(
"code" => 1420484634"datum" => 20150107"strecke" => "PL->A""vorname" => "Michael"),
// ...
); 
Willst du wirklich nur nach einem skalaren Wert wie einer Ganzzahl suchen? Es ist möglich, dass bspw. die Einträge für "code" oder "datum" eine Zahl enthalten, die in beiden Kategorien vorkommen kann. Du kannst dann nicht unterscheiden, in welcher der Suchbegriff gefunden wurde.

Für ganze Datensätze gehen Suchen und Ersetzen so:

PHP-Code:
// nach (exakt) diesem Datensatz suchen:      
$needle = array (
    
'code' => 1420484634,
    
'datum' => 20150107,
    
'strecke' => 'PL->A',
    
'vorname' => 'Michael',
);

$keys array_keys($fahrten$needletrue);
        
// Datensatz für ersten gefundenen Schlüssel löschen:
if (!empty ($keys)) {
    unset (
$fahrten[reset($keys)]);

oder auch so:

PHP-Code:
// nach (exakt) diesem Datensatz suchen:      
$needle = array (
    
'code' => 1420484634,
    
'datum' => 20150107,
    
'strecke' => 'PL->A',
    
'vorname' => 'Michael',
);

$key array_search($needle$fahrtentrue);
        
// Datensatz für ersten gefundenen Schlüssel löschen:
if ($key || false !== $key || null !== $key) {
    unset (
$fahrten[$key]);

Wenn du nicht nach ganzen Datensätzen sondern nach spezifischen Eigenschaften darin suchen willst, wird es komplizierter. Du musst dir die Suchfunktion selbst bauen:

PHP-Code:
function array_search_by_userfunc($haystack$cmpfunc$compare_with) {
    foreach (
$haystack as $key => $record) {
        if (
$cmpfunc($record$compare_with)) {
            return 
$key;
        }
    }
    return 
null;

Das liegt daran, dass PHP keine Array-nach-Key-Suchfunktion eingebaut hat, die mit einem benutzerdefinierten Vergleich zurechtkommt.

Eine benutzerdefinierte Vergleichsfunktion für deinen speziellen Fall könnte so aussehen:

PHP-Code:
// vergleicht zwei Arrays
$cmpfunc = function (
    
$item// das zu untersuchende Array
    
$compare_with // das Vergleichs-Array
) {
    
// "intersect": holt die Array-Bestandteile, die sich in beiden Arrays finden und gleich sind
    // "assoc": nur Eintraege mit gleichen Schluesseln werden verglichen
    
return count($compare_with) === count(array_uintersect_assoc(
        
$compare_with,
        
$item,
        function (
$a$b) {
            
// sufficient for finding equals (, but not for sorting!)
            
return $a === $b 1;
        }
    ));

Angewendet könnte das dann so aussehen:

PHP-Code:
$what_to_find = array (
    
'code' => 1420484634,
);

$key array_search_by_userfunc($fahrten$cmpfunc$what_to_find); 
... und weil das Ganze nicht allen wirklich gefällt, wurden für diese Anwendungszwecke Datenbanken erfunden.

Geändert von fireweasel (07-01-2015 um 15:36 Uhr) Grund: typos: Smiley + array_search() + array_keys()
Mit Zitat antworten