wake-up-neo.com

PHP - Eintrag nach Objekteigenschaft aus einem Array von Objekten suchen

Das Array sieht folgendermaßen aus:

[0] => stdClass Object
        (
            [ID] => 420
            [name] => Mary
         )

[1] => stdClass Object
        (
            [ID] => 10957
            [name] => Blah
         )
...

Und ich habe eine Ganzzahlvariable namens $v.

Wie kann ich einen Array-Eintrag auswählen, der ein Objekt enthält, dessen Eigenschaft 'ID' den Wert $v hat

126
Alex

Sie iterieren entweder das Array, suchen nach dem jeweiligen Datensatz (ok bei einer einmaligen Suche) oder erstellen eine Hashmap mit einem anderen assoziativen Array.

Für den ersteren so etwas

$item = null;
foreach($array as $struct) {
    if ($v == $struct->ID) {
        $item = $struct;
        break;
    }
}

Weitere Informationen zu letzterem finden Sie in dieser Frage und in den nachfolgenden Antworten. - Reference PHP - Array durch mehrere Indizes

151
Phil

YurkamTim ist richtig. Es braucht nur eine Modifikation: (Sorry, ich kann es jetzt nicht kommentieren).

Nach der Funktion ($) benötigen Sie einen Zeiger auf die externe Variable mit "use (& $ searchingValue)" und können dann auf die externe Variable zugreifen. Sie können es auch ändern.

$neededObject = array_filter(
    $arrayOfObjects,
    function ($e) use (&$searchedValue) {
        return $e->id == $searchedValue;
    }
);
56
Daniel Hardt

Ich habe eine elegantere Lösung gefunden hier . Angepasst an die Frage kann es aussehen:

$neededObject = array_filter(
    $arrayOfObjects,
    function ($e) {
        return $e->id == $searchedValue;
    }
);
21
YurkaTim
$arr = [
  [
    'ID' => 1
  ]
];

echo array_search(1, array_column($arr, 'ID')); // prints 0 (!== false)
18
Tim
class ArrayUtils
{
    public static function objArraySearch($array, $index, $value)
    {
        foreach($array as $arrayInf) {
            if($arrayInf->{$index} == $value) {
                return $arrayInf;
            }
        }
        return null;
    }
}

Die Art und Weise zu verwenden, die Sie wollten, wäre etwa so:

ArrayUtils::objArraySearch($array,'ID',$v);
8

Die Verwendung von array_column zum erneuten Indexieren spart Zeit, wenn Sie mehrmals suchen müssen:

$lookup = array_column($arr, NULL, 'id');   // re-index by 'id'

Dann kannst du einfach $lookup[$id] nach Belieben.

6
Museful

Ein kleiner Fehler des @YurkaTim wurde behoben, Ihre Lösung funktioniert für mich, aber use wird hinzugefügt:

Um $searchedValue zu verwenden, kann innerhalb der Funktion eine Lösung use ($searchedValue) nach den Funktionsparametern function ($e) HERE sein.

die array_filter-Funktion kehrt nur bei $neededObject zurück, wenn die Bedingung für die Rückkehr true ist. 

Wenn $searchedValue eine Zeichenfolge oder Ganzzahl ist:

$searchedValue = 123456; // Value to search.
$neededObject = array_filter(
    $arrayOfObjects,
    function ($e) use ($searchedValue) {
        return $e->id == $searchedValue;
    }
);
var_dump($neededObject); // To see the output

Wenn $searchedValue ein Array ist, in dem eine Überprüfung erforderlich ist:

$searchedValue = array( 1, 5 ); // Value to search.
$neededObject  = array_filter(
    $arrayOfObjects,
    function ( $e ) use ( $searchedValue ) {
        return in_array( $e->term_id, $searchedValue );
    }
);
var_dump($neededObject); // To see the output

Manchmal benutze ich gerne die Funktion array_reduce () , um die Suche durchzuführen. Sie ähnelt array_filter (), hat jedoch keine Auswirkungen auf das durchsuchte Array, sodass Sie multiple - Suchen in demselben Array von Objekten durchführen können.

$haystack = array($obj1, $obj2, ...); //some array of objects
$needle = 'looking for me?'; //the value of the object's property we want to find

//carry out the search
$search_results_array = array_reduce(
  $haystack,

  function($result_array, $current_item) use ($needle){
      //Found the an object that meets criteria? Add it to the the result array 
      if ($current_item->someProperty == $needle){
          $result_array[] = $current_item;
      }
      return $result_array;
  },
  array() //initially the array is empty (i.e.: item not found)
);

//report whether objects found
if (count($search_results_array) > 0){
  echo "found object(s): ";
  print_r($search_results_array[0]); //sample object found
} else {
  echo "did not find object(s): ";
}
2
yuvilio

Versuchen

$entry = current(array_filter($array, function($e) use($v){ return $e->ID==$v; }));

arbeitsbeispiel hier

1

Ich habe dies mit einer Art Java-Keymap gemacht. Wenn Sie das tun, müssen Sie nicht jedes Mal über Ihr Objekt-Array gehen.

<?php

//This is your array with objects
$object1 = (object) array('id'=>123,'name'=>'Henk','age'=>65);
$object2 = (object) array('id'=>273,'name'=>'Koos','age'=>25);
$object3 = (object) array('id'=>685,'name'=>'Bram','age'=>75);
$firstArray = Array($object1,$object2);
var_dump($firstArray);

//create a new array
$secondArray = Array();
//loop over all objects
foreach($firstArray as $value){
    //fill second        key          value
    $secondArray[$value->id] = $value->name;
}

var_dump($secondArray);

echo $secondArray['123'];

ausgabe:

array (size=2)
  0 => 
    object(stdClass)[1]
      public 'id' => int 123
      public 'name' => string 'Henk' (length=4)
      public 'age' => int 65
  1 => 
    object(stdClass)[2]
      public 'id' => int 273
      public 'name' => string 'Koos' (length=4)
      public 'age' => int 25
array (size=2)
  123 => string 'Henk' (length=4)
  273 => string 'Koos' (length=4)
Henk
1
Mart-Jan

So erhalten Sie sofort den ersten Wert:

$neededObject = array_reduce(
    $arrayOfObjects,
    function ($result, $item) use ($searchedValue) {
        return $item->id == $searchedValue ? $item : $result;
    }
);
0
AndreyP

Ich habe hier veröffentlicht, was ich mit einem schnellen binären Suchalgorithmus effizient lösen kann, um dieses Problem zu lösen: https://stackoverflow.com/a/52786742/1678210

Ich wollte nicht die gleiche Antwort kopieren. Jemand anderes hatte es etwas anders gefragt, aber die Antwort ist die gleiche.

0
Justin Jack