2009-05-13 45 views

Trả lời

25

Nếu bạn có một mảng 2D, như trong ví dụ của bạn, bạn sẽ cần phải tùy chỉnh một chút:

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; 
} 

Nếu bạn muốn chỉ tìm kiếm trong một trường cụ thể, bạn có thể thay đổi chức năng thành một mục như sau:

function array_search2d_by_field($needle, $haystack, $field) { 
    foreach ($haystack as $index => $innerArray) { 
     if (isset($innerArray[$field]) && $innerArray[$field] === $needle) { 
      return $index; 
     } 
    } 
    return false; 
} 
+2

Thay vì lặp mảng với vòng lặp for/count - tại sao không "foreach ($ haystack as $ key => $ value)" - cũng có thể tìm thấy 'user1' trong bất kỳ trường nào, không chỉ "username" – gnarf

+0

Oh. OP là một chút mơ hồ về khía cạnh đó của vấn đề. Tôi sẽ chỉnh sửa ngay bây giờ. – nickf

+0

Giải pháp rất đẹp +1 – nikhil

27

Hãy xem array_search.

Từ file PHP giúp đỡ:

<?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; 
?> 
+2

điều này sẽ không có tác dụng với anh ấy vì anh ấy có mảng 2D. mặc dù ... nó đã được chấp nhận, kỳ lạ. – nickf

+0

Vâng, xin lỗi tôi đã chấp nhận nó quá sớm. Bất kỳ ý tưởng về làm thế nào để làm điều đó với một mảng 2D? – roflwaffle

+1

@nickf, nó thực sự trả lời tiêu đề của câu hỏi, nghĩ rằng nó thực sự không trả lời cơ thể của nó. –

2

Có lẽ sử dụng array_filterarray_keys cùng nhau sẽ hữu ích.

Phương pháp tiếp cận dựa trên lớp học.

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

Tạo:

array(1) { 
    [3]=> 
    array(1) { 
    ["username"]=> 
    string(5) "user2" 
    } 
} 
array(1) { 
    [0]=> 
    int(3) 
} 
Key for first 'username'=>'user1' element is: 1 

Nếu không sử dụng các lớp - điều này tạo ra kết quả tương tự:

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

chắc chắn thực tế là bạn cần phải thực hiện một Class hoặc sử dụng globals có nghĩa rằng đây không phải là cách tiếp cận tuyệt vời? Nó khá có thể trong một vài dòng mã, nếu bạn chỉ sử dụng một vòng lặp. – nickf

+0

Bạn đã không nghĩ đến việc tìm kiếm đơn giản cho đến sau khi tôi thấy câu trả lời của bạn :) - Làm việc tốt – gnarf

6

này sẽ rất đơn giản

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

    return false; 
} 
2

Nếu bạn biết rằng là username, chỉ cần sử dụng một mảng làm thông số tìm kiếm:

$username = 'user1'; 
$key = array_search(array('username' => $username), $array); 
Các vấn đề liên quan