Xin góp ý cách xử lý dữ liệu từ 2 mảng
Như tiêu đề thì mình có 2 mảng: (Mình dùng PHP + Lar)
- Mảng 1: chứa 100 phần tử do người dùng truyền vào
- Mảng 2: là mình đã lấy 100 phần tử đó để truyền qua api và trả về response, mình convert cái response này thành 1 mảng. Mảng này chứa những phần tử có trong DB trên server Vậy có cách nào để check xem những phần tử nào của mảng 1 có trong mảng 2 mà tối ưu nhất không nhỉ, còn nếu foreach ra thì mình đang làm như vậy rồi? Mình không viết đoạn api đó nên bên kia trả về như nào là mình phải xử lý theo như vậy.
Hiện tại mình đang check trong mảng 2 có tồn tại key không (Email của mảng 1 là key trong mảng 2)
Mảng 1: Mảng 2:
4 CÂU TRẢ LỜI
Nếu là javascript thì mình hay dùng map để tạo một mảng key từ mảng 2. Sau đó ở mảng 1 sử dụng filter và indexof để lấy phần tử nào của mảng 1 có trong mảng 2.
let lstkey = array2.map(a => { return a.email; });
let lstarr = array1.filter(a => { return lstkey.indexOf(a.email) > -1; });
mình dùng PHP + Lar bạn ạ
@TuanAnh9996 với PHP bạn dùng array_map, array_filter (hoặc array_where ở Lar) và array_search nhé
thay vì chỉ trả về một mảng chỉ các phần tử có tồn tại thì bạn trả về kết quả của tất cả 100 phần tử, cái nào ko có thì kết quả là null
thôi, đỡ phải check.
cái trả về là của bên API bạn ơi, bên họ trả về như nào thì mình dùng thế thôi
vậy thì bạn làm một cái hash, hoặc dictionary, duyệt qua một vòng các phần tử của mảng 2, đánh dấu là 1 với mỗi email, ví dụ {a@gmail.com: 1, b@gmail.com: 1}
sau đó với bên 100 phần tử của mảng 1, check dictionary bên trên đó, nếu tồn tại thì là 1, không tồn tại thì là 0 (default)
sẽ không cần phải tốn vòng lặp lồng nhau mà chỉ là 2 lần duyệt mảng đơn (tối đa 100 phần tử).
$arr1 = [1,2,3,4,5]; $arr2 = [1,7,9,3,4,1,5];
$arr_filter = array_intersect($arr1,$arr2);
foreach ($arr_filter as $key => $value ) { echo $value."\n"; }
// result 1 3 4 5
Đây là suggest của mình
Vậy có cách nào để check xem những phần tử nào của mảng 1 có trong mảng 2 mà tối ưu nhất không nhỉ, còn nếu foreach ra thì mình đang làm như vậy rồi?
bạn thử triển khai ý tưởng này trên PHP thử nhé, mình làm nó trên JavaScript
let arr1 = [1,3,5,4];
let arr2 = [1,7,9,3,4,1,5];
//unique arr & sort
arr1 = [...new Set(arr1)].sort();
arr2 = [...new Set(arr2)].sort();
//check tồn tại:
arr2.toString().includes(arr1.toString())
không hẳn là tối ưu, nhưng không cần foreach