2009-07-31 10 views
18

Tôi cần lấy các khóa từ các giá trị trùng lặp. Tôi đã cố gắng sử dụng array_search và làm việc tốt, NHƯNG tôi chỉ nhận được giá trị đầu tiên như là một hit.Cách tìm kiếm Mảng cho nhiều giá trị trong PHP?

Tôi cần lấy cả hai khóa từ các giá trị trùng lặp, trong trường hợp này là 0 và 2. Kết quả đầu ra tìm kiếm dưới dạng mảng sẽ là tốt.

Có chức năng PHP để thực hiện việc này hay tôi cần phải viết một số vòng lặp để thực hiện?

$list[0][0] = "2009-09-09"; 
$list[0][1] = "2009-05-05"; 
$list[0][2] = "2009-09-09"; 
$list[1][0] = "first-paid"; 
$list[1][1] = "1"; 
$list[1][2] = "last-unpaid"; 

echo array_search("2009-09-09",$list[0]); 

Trả lời

25

Bạn muốn array_keys với giá trị tìm kiếm

array_keys($list[0], "2009-09-09"); 

mà sẽ trả về một mảng của các phím với giá trị quy định, trong trường hợp của bạn [0, 2]. Nếu bạn muốn tìm các bản sao là tốt, trước tiên bạn có thể thực hiện một vượt qua với array_unique, sau đó lặp qua mảng đó bằng cách sử dụng mảng_keys trên bản gốc; bất kỳ thứ gì trả về một mảng có độ dài> 1 là một bản sao và kết quả là các khóa mà trong đó các bản sao được lưu trữ. Một cái gì đó giống như ...

$uniqueKeys = array_unique($list[0]) 

foreach ($uniqueKeys as $uniqueKey) 
{ 
    $v = array_keys($list[0], $uniqueKey); 

    if (count($v) > 1) 
    { 
    foreach ($v as $key) 
    { 
     // Work with $list[0][$key] 
    } 

    } 
} 
+0

Cảm ơn! Tôi sao chép dán dòng đầu tiên của mã. Nó hoạt động như mong đợi. –

+0

array_keys Sẽ có thêm trợ giúp – raftaar1191

8

Trong array_search() chúng ta có thể đọc:

Nếu kim được tìm thấy trong đống cỏ khô hơn hơn một lần, chìa khóa phù hợp đầu tiên là trả lại. Để trả lại khóa cho tất cả các giá trị phù hợp , hãy sử dụng array_keys() với tham số search_value tùy chọn thay thế.

+0

một mảng là như thế này (0 = > (student_id => 10215, roll_no => 23), 1 => (......)) Làm cách nào để tìm kiếm student_id của khóa không có cuộn. 23. –

7

Sự kết hợp sau đây gọi hàm sẽ cung cấp cho bạn tất cả các giá trị nhân bản:

$a = array(1, 1, 2, 3, 4, 5, 99, 2, 5, 2); 

$unique  = array_unique($a); // preserves keys 
$diffkeys = array_diff_key($a, $unique); 
$duplicates = array_unique($diffkeys); 

echo 'Duplicates: ' . join(' ', $duplicates) . "\n"; // 1 2 5 
2

Bạn có thể đạt được điều đó bằng bằng cách sử dụng while vòng lặp và thực hiện giải pháp sau đây :

while (($key = array_search("2009-09-09", $list[0])) !== FALSE) { 
    print($key); 
    unset($list[0][$key]); 
} 

Nguồn: cue at openxbox at php.net

Đối với mảng một đa chiều, bạn có thể sử dụng chức năng sau đây để đạt được điều đó (như thay thế cho array_keys()):

function array_isearch($str, $array){ 
    $found = array(); 
    foreach ($array as $k => $v) { 
    if (strtolower($v) == strtolower($str)) { 
     $found[] = $k; 
    } 
    } 
    return $found; 
} 

Nguồn: robertark, php.net