das wird für ihn nicht funktionieren, da er ein 2D-Array hat. obwohl … es wurde seltsamerweise akzeptiert.
– Nickf
13. Mai 2009 um 1:02 Uhr
Ja, tut mir leid, dass ich es zu früh akzeptiert habe. Irgendeine Idee, wie man es mit einem 2D-Array macht?
– Roflwaffel
13. Mai 2009 um 1:06 Uhr
@nickf, es beantwortet tatsächlich den Titel der Frage, dachte, es beantwortet tatsächlich nicht den Hauptteil davon.
– Laurent
24. April 2014 um 21:05 Uhr
Diese Antwort ist für diese gestellte Frage falsch/unangemessen. Seine Stimmenzahl wird die Forscher nur irreführen/verwirren.
– mickmackusa
gestern
Nickf
Wenn Sie wie in Ihrem Beispiel ein 2D-Array haben, müssen Sie die Dinge ein wenig anpassen:
function array_search2d($needle, $haystack) {
for ($i = 0, $l = count($haystack); $i < $l; ++$i) {
if (in_array($needle, $haystack[$i])) return $i;
}
return false;
}
$myArray = array(
array( 'username' => 'user1' ),
array( 'username' => 'user2' )
);
$searchTerm = "user1";
if (false !== ($pos = array_search2d($searchTerm, $myArray))) {
echo $searchTerm . " found at index " . $pos;
} else {
echo "Could not find " . $searchTerm;
}
Wenn Sie nur in einem bestimmten Feld suchen möchten, können Sie die Funktion folgendermaßen ändern:
function array_search2d_by_field($needle, $haystack, $field) {
foreach ($haystack as $index => $innerArray) {
if (isset($innerArray[$field]) && $innerArray[$field] === $needle) {
return $index;
}
}
return false;
}
Anstatt das Array mit der for/count-Schleife zu durchlaufen – warum nicht „foreach($haystack as $key => $value)“ – würde dies auch „user1“ in jedem Feld finden, nicht nur „username“.
– gnarf
13. Mai 2009 um 1:57 Uhr
Oh. Das OP war in Bezug auf diesen Aspekt des Problems etwas zweideutig. Ich werde jetzt bearbeiten.
– Nickf
13. Mai 2009 um 3:25 Uhr
Shaolin
Das wäre ganz einfach
private function getArrayKey($haystack, $needle)
{
foreach($haystack as $key => $product)
{
if ($product['id'] === $needle)
return $key;
}
return false;
}
AbraCadaver
Wenn Sie wissen, dass der Schlüssel ist usernameverwenden Sie einfach ein Array als Suchparameter:
<?php
class ArraySearch2d {
static protected $_key;
static protected $_value;
static function isMatch($element)
{
if (!is_array($element)) return false;
return $element[self::$_key] == self::$_value;
}
static function filter(array $arrayToSearch, $key, $value)
{
if (!is_string($key)) throw new Exception("Array Key must be a string");
self::$_key = $key;
self::$_value = $value;
return array_filter($arrayToSearch, 'ArraySearch2d::isMatch');
}
// to directly answer your question.
static function getIndex(array $arrayToSearch, $key, $value)
{
$matches = self::filter($arrayToSearch, $key, $value);
if (!count($matches)) return false;
$indexes = array_keys($matches);
return $indexes[0];
}
}
$array = array("1"=>array('username'=>'user1'), "3"=>array('username'=>'user2'));
$matches = ArraySearch2d::filter($array, 'username', 'user2');
var_dump($matches);
$indexs = array_keys($matches);
var_dump($indexs);
// Demonstrating quick answer:
echo "Key for first 'username'=>'user1' element is: "
.ArraySearch2d::getIndex($array, 'username', 'user1')."\n";
Produziert:
array(1) {
[3]=>
array(1) {
["username"]=>
string(5) "user2"
}
}
array(1) {
[0]=>
int(3)
}
Key for first 'username'=>'user1' element is: 1
Ohne die Verwendung von Klassen führt dies zum gleichen Ergebnis:
<?php
$field="username";
$value = "user2";
function usernameMatch($element)
{
global $field, $value;
if (!is_array($element)) return false;
return $element[$field] == $value;
}
function getFirstIndex(array $array)
{
if (!count($array)) return false;
$indexes = array_keys($array);
return $indexes[0];
}
$array = array("1"=>array('username'=>'user1'), "3"=>array('username'=>'user2'));
$matches = array_filter($array, 'usernameMatch');
var_dump($matches);
$indexs = array_keys($matches);
var_dump($indexs);
// Demonstrating quick answer - and why you should probably use the class-
// you don't want to have to remember these "globals" all the time.
$field = 'username';
$value="user1";
echo "Key for first 'username'=>'user1' element is: "
.getFirstIndex(array_filter($array, 'usernameMatch'));
die Tatsache, dass Sie entweder eine Klasse implementieren oder globale Werte verwenden müssen, bedeutet sicherlich, dass dies keine großartigen Ansätze sind? Es ist in ein paar Codezeilen durchaus möglich, wenn Sie nur eine Schleife verwenden.
– Nickf
13. Mai 2009 um 3:33 Uhr
die Tatsache, dass Sie entweder eine Klasse implementieren oder globale Werte verwenden müssen, bedeutet sicherlich, dass dies keine großartigen Ansätze sind? Es ist in ein paar Codezeilen durchaus möglich, wenn Sie nur eine Schleife verwenden.
– Nickf
13. Mai 2009 um 3:33 Uhr
14065700cookie-checkHolen Sie sich den Index der Zeile mit dem qualifizierenden Wert aus einem 2D-Arrayyes