php - multidimensional - Obtener índice de elemento en una matriz por el valor
matrices en php (5)
Tengo esta matriz en PHP:
array(
[0] => array( ''username'' => ''user1'' )
[1] => array( ''username'' => ''user2'' )
)
Si tengo la cadena ''nombre de usuario'', ¿cómo puedo obtener el valor del índice como un número?
Ejemplo, si tengo ''usuario1'', ¿cómo puedo obtener 0?
Echa un vistazo a array_search .
Desde el archivo de ayuda PHP:
<?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;
?>
Esto seria muy simple
private function getArrayKey($haystack, $needle)
{
foreach($haystack as $key => $product)
{
if ($product[''id''] === $needle)
return $key;
}
return false;
}
Si sabe que la clave es el username
, solo use una matriz como parámetro de búsqueda:
$username = ''user1'';
$key = array_search(array(''username'' => $username), $array);
Si tiene una matriz 2D, como en su ejemplo, necesitará personalizar un poco las cosas:
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;
}
Si quisiera buscar en un solo campo en particular, podría alterar la función a algo como esto:
function array_search2d_by_field($needle, $haystack, $field) {
foreach ($haystack as $index => $innerArray) {
if (isset($innerArray[$field]) && $innerArray[$field] === $needle) {
return $index;
}
}
return false;
}
Tal vez el uso de array_filter
y array_keys
juntos ayudará.
Enfoque basado en la clase.
<?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";
Produce:
array(1) {
[3]=>
array(1) {
["username"]=>
string(5) "user2"
}
}
array(1) {
[0]=>
int(3)
}
Key for first ''username''=>''user1'' element is: 1
Sin usar clases - esto produce el mismo resultado:
<?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''));