Asked Dec 24th, 2018 6:54 AM 147 1 4
  • 147 1 4
0

Xin góp ý cách xử lý dữ liệu từ 2 mảng

Share
  • 147 1 4

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 ANSWERS


Answered Dec 24th, 2018 8:49 AM
Accepted
+1

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; });
Share
Nguyen Tuan Anh @TuanAnh9996
Dec 24th, 2018 8:53 AM

mình dùng PHP + Lar bạn ạ

0
| Reply
Share
Dec 24th, 2018 9:01 AM

@TuanAnh9996 với PHP bạn dùng array_map, array_filter (hoặc array_where ở Lar) và array_search nhé

https://laravel.com/docs/5.7/collections

+1
| Reply
Share
Answered Dec 25th, 2018 1:33 AM
+1

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.

Share
Nguyen Tuan Anh @TuanAnh9996
Dec 25th, 2018 2:23 AM

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

0
| Reply
Share
Do Trung Kien @kiendinang
Dec 25th, 2018 3:15 AM

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ụ {[email protected]: 1, [email protected]: 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ử).

+1
| Reply
Share
Answered Dec 27th, 2018 3:54 AM
0

$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 😄

Share
Answered May 17th, 2019 6:00 AM
0

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

Share