2016-04-13 23 views
5

Tôi có một mảng mà trông như thế này:Nhận giá trị mảng cụ thể trong đó một giá trị khác là "1"?

Id = "ADA001" 
    Stock: 15 

Mảng có khoảng 1.700 hồ sơ mà trông giống nhau, làm thế nào tôi sẽ tìm kiếm các mảng cho ID 1 và trả lại chứng khoán?

Edit: tôi sẽ cần truy cập vào chứng khoán của mỗi một trong những 17000 hồ sơ

Edit: tôi đã nhận được sự giúp đỡ của Daniel Centore, ông nói với tôi để thiết lập một khóa chính để mảng id của mục và nó bằng với cổ phiếu, nhưng tôi không thể làm cho nó hoạt động được.

tôi hiện đang nhận được dữ liệu từ một cơ sở dữ liệu MySQL và tôi lưu nó trong một mảng, như vậy:

 $data[] = array(); 
    $getdisposabletest = mysqli_query($connect, "Select id, disposable FROM products");  

while ($z = mysqli_fetch_array($getdisposabletest)) { 
    $data = $z; 
} 

Bây giờ khi tôi sử dụng mã Daniels trông như thế này:

$myMap = []; 
foreach($data as $item) { 
    $myMap[$item['id']] = $item['disposable']; 
} 

Nó không trả lại bất cứ điều gì khi tôi cố gắng lặp lại sản phẩm của mình bằng ID "ADA001"

echo $myMap["ADA001"]; 

Ngoài ra khi tôi làm "đếm ($ mymap)" nó nói rằng 2 bản ghi của nó lớn, khi nào nó phải là muuuch lớn hơn thế?

Cảm ơn bạn đã trợ giúp

+0

bạn sẽ chia sẻ thêm một chút cấu trúc mảng –

+0

Nếu id là duy nhất thì sẽ có ý nghĩa trong thời gian dài cho mảng được lập chỉ mục dựa trên chúng, cũng như giải quyết vấn đề cụ thể này. – iainn

+0

Sử dụng 'array_filter (...)' http://php.net/manual/en/function.array-filter.php, và nếu bạn chắc chắn rằng ID là duy nhất, sử dụng 'current (array_filter (...)) 'để trả về bản ghi đầu tiên. – Anton

Trả lời

0

Bạn sẽ làm điều gì đó như thế này.

$newArray=[]; 
foreach($array as $item){ 
    if($item['Id'] === 1){ 
     $newArray[] = $item; 
    } 
} 
$stockArray = array_column($newArray,'Stock'); 
+0

Tôi chắc chắn sẽ sử dụng '===' nếu thử nghiệm cho 1 hoặc 0. – DevDonkey

+0

Tôi không biết nếu 1 là một chuỗi hoặc số nguyên – Neoaptt

+1

cho một loạt 1700 mục tôi sẽ đề nghị đặt id là chìa khóa cho mảng –

3

Tôi sẽ sử dụng array_filter. Trả về kết quả của một bộ so sánh.

$results = array_filter($targetArray, function($el) { 
    return $el === 1; 
}); 
1

Edit: Bây giờ nó đã được thực hiện rõ ràng rằng OP muốn truy vấn từ hàng ngàn mặt hàng, cách chính xác để làm điều này là để làm cho Id chìa khóa cho một bản đồ trong PHP, như thế này :

$myMap = []; 
foreach($array as $item) { 
    $myMap[$item['Id']] = $item['Stock']; 
} 

Bây giờ, bất cứ khi nào bạn muốn truy cập mục '12', chỉ cần sử dụng $myMap['12'].

Lý do điều này nhanh hơn là do một thứ gọi là sự phức tạp về thuật toán. Bạn nên đọc về ký hiệu Big-O để biết thêm thông tin. Về cơ bản, hoạt động đầu tiên ở đây là theo thứ tự n và sau đó lặp qua từng mục trong số đó là theo thứ tự của n*log(n), do đó kết quả cuối cùng là theo thứ tự của n*log(n), đây là điều tốt nhất bạn có thể không có thêm thông tin. Tuy nhiên, nếu bạn chỉ truy cập vào một phần tử, chỉ cần truy cập vào một phần tử thông qua MySQL sẽ tốt hơn vì nó sẽ theo thứ tự của log(n), nhanh hơn.

Chỉnh sửa 2: Cũng cần lưu ý rằng nếu bạn đã truy cập mutliple lĩnh vực (tức không chỉ là cổ phiếu), bạn có thể làm như sau: chứng khoán

$myMap = []; 
foreach($array as $item) { 
    $myMap[$item['Id']] = $item; 
} 

Và chỉ đơn giản là truy cập mục 12 của như thế này: $myMap['12']['stock'] hoặc tên của nó như sau: $myMap['12']['name'].

+0

Có bạn là chính xác rằng tôi nhận được các mục từ một bảng, Nhưng hệ thống của tôi là phức tạp hơn nhiều so với điều này và những gì tôi đang cố gắng để giải quyết ngay bây giờ chỉ là một phần nhỏ của hệ thống của tôi. – user2750279

+0

Đây có phải là cách hiệu quả hơn nếu cho phép tôi nói rằng tôi có 2000 sản phẩm và tôi cần có được cổ phiếu của từng sản phẩm không? Việc truy vấn lại cơ sở dữ liệu nhiều lần có hiệu quả không? – user2750279

+0

Không, điều đó sẽ không hiệu quả hơn. Hãy nói rõ rằng đây là những gì bạn muốn làm trong câu hỏi và tôi sẽ cập nhật câu trả lời của tôi với câu trả lời đúng. –

Các vấn đề liên quan