Yêu cầu thg 12 24, 2018 6:54 SA 193 1 4
  • 193 1 4
0

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

Chia sẻ
  • 193 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 CÂU TRẢ LỜI


Đã trả lời thg 12 24, 2018 8:49 SA
Đã được chấp nhận
+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; });
Chia sẻ
Avatar Nguyen Tuan Anh @TuanAnh9996
thg 12 24, 2018 8:53 SA

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

thg 12 24, 2018 9:01 SA

@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

Đã trả lời thg 12 25, 2018 1:33 SA
+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.

Chia sẻ
Avatar Nguyen Tuan Anh @TuanAnh9996
thg 12 25, 2018 2:23 SA

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

Avatar Do Trung Kien @kiendinang
thg 12 25, 2018 3:15 SA

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ử).

Đã trả lời thg 12 27, 2018 3:54 SA
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 😄

Chia sẻ
Đã trả lời thg 5 17, 2019 6:00 SA
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

Chia sẻ
Viblo
Hãy đăng ký một tài khoản Viblo để nhận được nhiều bài viết thú vị hơn.
Đăng kí