Câu trả lời:
Bạn có thể lặp lại mảng, tìm kiếm bản ghi cụ thể (ok trong một lần tìm kiếm duy nhất) hoặc xây dựng một hashmap bằng cách sử dụng một mảng kết hợp khác.
Đối với trước đây, một cái gì đó như thế này
$item = null;
foreach($array as $struct) {
if ($v == $struct->ID) {
$item = $struct;
break;
}
}
Xem câu hỏi này và các câu trả lời tiếp theo để biết thêm thông tin về câu hỏi sau - Mảng PHP tham khảo theo nhiều chỉ mục
isset($item)
nhưng tôi thích khởi tạo các biến một cách chính xác
if($v == $struct["ID"]){...
YurkamTim đã đúng. Nó chỉ cần một sửa đổi:
Sau hàm ($), bạn cần một con trỏ tới biến ngoài bằng cách "use (& $ searchValue)" và sau đó bạn có thể truy cập biến ngoài. Ngoài ra, bạn có thể sửa đổi nó.
$neededObject = array_filter(
$arrayOfObjects,
function ($e) use (&$searchedValue) {
return $e->id == $searchedValue;
}
);
&
là không cần thiết khi nhập khẩu $searchedValue
vào phạm vi đóng cửa. Cái &
này được sử dụng để tạo một tham chiếu chỉ cần thiết nếu $searchedValue
đã được sửa đổi bên trong bao đóng.
global
là duy nhất để chia sẻ dữ liệu trong các chức năng! Nhưng thật đáng tiếc nếu điều này thực sự chậm. :(
$arr = [
[
'ID' => 1
]
];
echo array_search(1, array_column($arr, 'ID')); // prints 0 (!== false)
Tôi đã tìm thấy giải pháp thanh lịch hơn ở đây . Thích nghi với câu hỏi có thể giống như:
$neededObject = array_filter(
$arrayOfObjects,
function ($e) use ($searchedValue) {
return $e->id == $searchedValue;
}
);
array_filter
trả về một mảng và sẽ không dừng ở giá trị đầu tiên được tìm thấy.
$searchedValue
bên trong chức năng. Nhưng bên ngoài nó là.
$searchedValue
nằm ngoài phạm vi đóng. Thứ hai, bạn nghĩ các phương thức mảng này hoạt động như thế nào? Tất cả đều lặp lại nội bộ
$searchedValue
cần viếtfunction ($e) use ($searchedValue) {
Sử dụng mảng_column để lập chỉ mục lại sẽ tiết kiệm thời gian nếu bạn cần tìm nhiều lần:
$lookup = array_column($arr, NULL, 'id'); // re-index by 'id'
Sau đó, bạn có thể chỉ đơn giản là tùy $lookup[$id]
ý.
class ArrayUtils
{
public static function objArraySearch($array, $index, $value)
{
foreach($array as $arrayInf) {
if($arrayInf->{$index} == $value) {
return $arrayInf;
}
}
return null;
}
}
Sử dụng nó theo cách bạn muốn sẽ là một cái gì đó như:
ArrayUtils::objArraySearch($array,'ID',$v);
Thử
$entry = current(array_filter($array, function($e) use($v){ return $e->ID==$v; }));
ví dụ làm việc ở đây
Sửa một lỗi nhỏ của @YurkaTim , giải pháp của bạn có hiệu quả với tôi nhưng thêm use
:
Để sử dụng $searchedValue
, bên trong hàm, một giải pháp có thể là use ($searchedValue)
sau các tham số hàm function ($e) HERE
.
các array_filter
chức năng chỉ trở về $neededObject
nếu điều kiện về lợi nhuận làtrue
Nếu $searchedValue
là một chuỗi hoặc số nguyên:
$searchedValue = 123456; // Value to search.
$neededObject = array_filter(
$arrayOfObjects,
function ($e) use ($searchedValue) {
return $e->id == $searchedValue;
}
);
var_dump($neededObject); // To see the output
Nếu $searchedValue
là mảng mà chúng ta cần kiểm tra với một danh sách:
$searchedValue = array( 1, 5 ); // Value to search.
$neededObject = array_filter(
$arrayOfObjects,
function ( $e ) use ( $searchedValue ) {
return in_array( $e->term_id, $searchedValue );
}
);
var_dump($neededObject); // To see the output
var_dump($neededObject);
:)
Đôi khi tôi thích sử dụng hàm Array_reduce () để thực hiện tìm kiếm. Nó tương tự như Array_filter () nhưng không ảnh hưởng đến mảng tìm kiếm, cho phép bạn thực hiện nhiều tìm kiếm trên cùng một mảng đối tượng.
$haystack = array($obj1, $obj2, ...); //some array of objects
$needle = 'looking for me?'; //the value of the object's property we want to find
//carry out the search
$search_results_array = array_reduce(
$haystack,
function($result_array, $current_item) use ($needle){
//Found the an object that meets criteria? Add it to the the result array
if ($current_item->someProperty == $needle){
$result_array[] = $current_item;
}
return $result_array;
},
array() //initially the array is empty (i.e.: item not found)
);
//report whether objects found
if (count($search_results_array) > 0){
echo "found object(s): ";
print_r($search_results_array[0]); //sample object found
} else {
echo "did not find object(s): ";
}
if ($current_item->someProperty == $needle){ $result_array[] = $current_item; }
Tôi đã làm điều này với một số loại sơ đồ bàn phím Java. Nếu bạn làm điều đó, bạn không cần phải lặp lại mảng đối tượng của mình mỗi lần.
<?php
//This is your array with objects
$object1 = (object) array('id'=>123,'name'=>'Henk','age'=>65);
$object2 = (object) array('id'=>273,'name'=>'Koos','age'=>25);
$object3 = (object) array('id'=>685,'name'=>'Bram','age'=>75);
$firstArray = Array($object1,$object2);
var_dump($firstArray);
//create a new array
$secondArray = Array();
//loop over all objects
foreach($firstArray as $value){
//fill second key value
$secondArray[$value->id] = $value->name;
}
var_dump($secondArray);
echo $secondArray['123'];
đầu ra:
array (size=2)
0 =>
object(stdClass)[1]
public 'id' => int 123
public 'name' => string 'Henk' (length=4)
public 'age' => int 65
1 =>
object(stdClass)[2]
public 'id' => int 273
public 'name' => string 'Koos' (length=4)
public 'age' => int 25
array (size=2)
123 => string 'Henk' (length=4)
273 => string 'Koos' (length=4)
Henk
Tôi đã đăng những gì tôi sử dụng để giải quyết vấn đề rất hiệu quả ở đây bằng Thuật toán tìm kiếm nhị phân nhanh: https://stackoverflow.com/a/52786742/1678210
Tôi không muốn sao chép cùng một câu trả lời. Một số người khác đã hỏi nó một chút khác nhau nhưng câu trả lời là như nhau.