Holen Sie sich den Index der Zeile mit dem qualifizierenden Wert aus einem 2D-Array

Lesezeit: 4 Minuten

Benutzeravatar von roflwaffle
roflwaffel

Ich habe dieses Array in PHP:

array(
    [0] => array( 'username' => 'user1' )
    [1] => array( 'username' => 'user2' )
)

Wenn ich die Zeichenfolge „Benutzername“ habe, wie kann ich den Indexwert als Zahl erhalten?

Beispiel, wenn ich ‘user1’ habe, wie kann ich 0 bekommen?

Schauen Sie sich an array_search.

Aus der PHP-Hilfedatei:

<?php
$array = array(0 => 'blue', 1 => 'red', 2 => 'green', 3 => 'red');

$key = array_search('green', $array); // $key = 2;
$key = array_search('red', $array);   // $key = 1;
?>

  • 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


Benutzeravatar von nickf
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

Benutzeravatar von Shaolin
Shaolin

Das wäre ganz einfach

private function getArrayKey($haystack, $needle)
{
  foreach($haystack as $key => $product)
  {
     if ($product['id'] === $needle)
     return $key;
  }

  return false;
}

Benutzeravatar von AbraCadaver
AbraCadaver

Wenn Sie wissen, dass der Schlüssel ist usernameverwenden Sie einfach ein Array als Suchparameter:

$username="user1";
$key = array_search(array('username' => $username), $array);

Benutzeravatar von gnarf
gnarf

Vielleicht mit array_filter und array_keys zusammen hilft.

Klassenbasierter Ansatz.

<?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

1406570cookie-checkHolen Sie sich den Index der Zeile mit dem qualifizierenden Wert aus einem 2D-Array

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy