Php 通过值获取数组中元素的索引

Php 通过值获取数组中元素的索引,php,Php,我有一个PHP数组: array( [0] => array( 'username' => 'user1' ) [1] => array( 'username' => 'user2' ) ) 如果我有“username”字符串,我如何才能获得作为数字的索引值 例如,如果我有“user1”,我如何获得0?请查看 从PHP帮助文件: <?php $array = array(0 => 'blue', 1 => 'red', 2 =>

我有一个PHP数组:

array(
    [0] => array( 'username' => 'user1' )
    [1] => array( 'username' => 'user2' )
)
如果我有“username”字符串,我如何才能获得作为数字的索引值

例如,如果我有“user1”,我如何获得0?

请查看

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

如果您有一个2D数组,如示例中所示,则需要对其进行一些定制:

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;
}
也许将和一起使用会有所帮助

基于类的方法

<?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";
不使用类-这会产生相同的结果:

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

这将非常简单

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

  return false;
}

如果知道键是
用户名
,只需使用数组作为搜索参数:

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

这对他不起作用,因为他有一个2D数组。虽然。。。奇怪的是,它被接受了。是的,很抱歉我接受得太快了。有没有关于如何使用2D数组的想法?@nickf,它实际上回答了问题的标题,虽然它确实没有回答问题的主体。这就是我搜索的答案。与其使用for/count循环来循环数组,不如使用“foreach($haystack as$key=>$value)”,还可以在任何字段中找到“user1”,而不仅仅是“用户名”“噢。OP在问题的这一方面有点模棱两可。我现在就编辑。您需要实现一个类或使用globals这一事实是否意味着这些都不是很好的方法?如果你只是使用一个循环,那么在几行代码中就很有可能实现。直到我看到你的答案后才想到简单的foreach:)-干得好
private function getArrayKey($haystack, $needle)
{
  foreach($haystack as $key => $product)
  {
     if ($product['id'] === $needle)
     return $key;
  }

  return false;
}
$username = 'user1';
$key = array_search(array('username' => $username), $array);