2015-05-18 15 views
5

Tôi có mảng JSON sau, trong trường hợp này nó chỉ có ba mục nhập, nhưng cũng có thể có nhiều hơn.JSON: Bắt đầu nhập với giá trị cụ thể

[ 
    { 
     "id": 45, 
     "text": "apple" 
    }, 
    { 
     "id": 37, 
     "text": "pear" 
    }, 
    { 
     "id": 22, 
     "text": "strawberry" 
    } 
] 

Bây giờ câu hỏi của tôi là: Làm thế nào để tôi có được text biến của sự xâm nhập với (ví dụ) id37 trong PHP? Có thể dễ dàng nhận được điều đó không?

Những gì tôi biết: Tôi có thể sử dụng một vòng lặp for cho việc tìm kiếm các văn bản như thế này (trong PHP):

<?php 
    $fruits = json_decode(file_get_contents("file.json"), true); // First I decode the file 
    for ($i = 0; $i < count($fruits); $i++) { 
     // Using this for loop and if condition, I get the text I need 
     if ($fruits[$i]['id'] == 37) echo $fruits[$i]['text']; 
    } 
?> 

Nhưng tôi không muốn sử dụng một vòng lặp for, như mảng JSON của tôi có nhiều hơn 3 mục, và nếu tôi yêu cầu rất nhiều dữ liệu trong thời gian ngắn phải mất nhiều thời gian cho đến khi vòng lặp đi qua tất cả các mục nhập. Vì vậy, có một cách hiệu quả hơn để có được kết quả tương tự? Ai đó có thể giải thích cho tôi điều này trong PHP?

+0

Tôi nghĩ bạn phải sử dụng bất kỳ loại vòng lặp nào để nhận thông tin của bạn. Bạn có thể sử dụng 'array_filter()' nhưng điều này cũng có một vòng lặp nội bộ. – TiMESPLiNTER

+0

Hầu hết các giải pháp được đề xuất dưới đây sử dụng vòng lặp (mỗi) bên trong, do đó chúng sẽ không nhanh hơn đáng kể khi đó giải pháp được đề xuất của riêng bạn. Trong trường hợp bạn cần tìm kiếm dữ liệu 'json' nhiều lần, tôi sẽ đề nghị lưu trữ chúng như' khóa' 'giá trị' bằng' id' làm khóa. Điều này đã được đề xuất nhiều lần. – Wilt

+0

Bạn có kiểm soát cấu trúc dữ liệu Dejori David không?Bạn có thể tạo các phần tử được sắp xếp theo id khi bạn tạo dữ liệu json không? nếu có, bạn có thể áp dụng tìm kiếm nhị phân trên đó. – Klaus

Trả lời

0

nếu bạn có thể thay đổi cấu trúc json của bạn sau đó nó có thể.

Nếu bạn tạo json như thế này

{ 
    "45":{ 
     "text": "apple" 
    }, 
    "37":{ 
     "text": "pear" 
    }, 
    "22":{ 
     "text": "strawberry" 
    } 
} 

và trong php

echo $item['37']['text']; 

Điều này sẽ giúp :)

0

Thay đổi mã này:

<?php 
    $fruits = json_decode(file_get_contents("file.json"), true); // First I decode the file 
    for ($i = 0; $i < count($fruits); $i++) { 
     // Using this for loop and if condition, I get the text I need 
     if ($fruits[$i]['id'] == 37) echo $fruits[$i]['text']; 
    } 
?> 

để

<?php 
    $fruits = json_decode(file_get_contents("file.json"), true); // First I decode the file 
    foreach ($fruits as $fruit) { 
     // Using this for loop and if condition, I get the text I need 
     if ($fruits['id'] == 37) { 
     echo $fruits['text']; 
     //rest of your code you like to add 
     } 
    } 
?> 

nếu bạn có ý định sử dụng cho vòng lặp chỉ sau đó sử dụng mã dưới đây:

<?php 
    $fruits = json_decode(file_get_contents("file.json"), true); // First I decode the file 
    for ($i = 0; $i < count($fruits); $i++) { 
     // Using this for loop and if condition, I get the text I need 
     if ($fruits['id'] == 37) { 
     echo $fruits['text']; 
     //rest of your code you like to add 
     } 
    } 
?> 
+0

Cũng thêm một 'ngắt;' trong khối 'if'. Để dừng vòng lặp nếu bạn tìm thấy những gì bạn muốn. – TiMESPLiNTER

+0

Bạn đang tham chiếu '$ fruits' làm đối tượng khi nó được giải mã dưới dạng mảng. Điều này sẽ ném lỗi. – Darren

+1

@Darren, đã chỉnh sửa cảm ơn vì đã thông báo. –

0

Bạn có thể làm điều đó chỉ đơn giản với điều này :

foreach($fruits as $item) { 
    if($item['id'] == 37) { echo $item['text']; break; } 
} 

Example

1

Các giải pháp với array_filter():

$yourEntry = current(array_filter($jsonArray, function(\stdClass $entry) { 
    return ($entry->id == 37); 
})); 

See the example

+0

Được bỏ phiếu của tôi, yêu thích giải pháp thay thế array_filter! – Darren

0

Bạn có kiểm soát cấu trúc dữ liệu json? Nếu có, bạn có thể thay đổi để truy cập thông qua khóa mảng, ví dụ:

{ 
    '37': 'pear', 
    '45': 'apple', 
    '22': 'strawberry' 
} 

$ fruits = json_decode (file_get_contents ("file.json"), true);

echo $ fruits ['37 ']; // lê

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