valor una obtener multidimensional matriz matrices indice index hacer como buscar array_search array 3x3 php

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''));