2015-05-18 13 views
5

Aşağıdaki JSON dizisine sahibim, bu durumda yalnızca üç girdisi var, ancak daha fazlası da olabilir. JSON: Belirli bir değerle giriş yapma

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

Şimdi benim sorum edilir: Nasıl (örneğin) id PHP'de 37 olmak giriş text değişken alabilirim? Bunu kolayca elde etmek mümkün mü? Ben (PHP) böyle metni bulmak için döngü için kullanabilirsiniz:

biliyorum ne

<?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']; 
    } 
?> 

Ama benim JSON dizisi fazla olduğu gibi, döngünün bir kullanmak istemiyoruz 3 girdiden daha fazla ve çok fazla veriyi kısa sürede talep edersem, for döngüsü her girişten geçene kadar uzun zaman alır. Aynı sonuca ulaşmak için daha etkili bir yol var mı? Birisi bana bunu PHP'de açıklayabilir mi?

+0

Bilgilerinizi almak için herhangi bir döngü kullanmanız gerektiğini düşünüyorum. 'Array_filter() 'işlevini kullanabilirsiniz, ancak bu aynı zamanda bir iç döngü de yapar. – TiMESPLiNTER

+0

Aşağıdaki önerilen çözümlerin çoğunda dahili olarak bir (her) döngü kullanılır, böylece önerilen çözümünüzden çok daha hızlı olmayacaktır. Eğer 'json' verilerini birkaç kez aramanız gerekiyorsa, bunları anahtar olarak 'id' ile 'anahtar' değeri olarak saklamanızı öneririm. Bu zaten birkaç kez önerilmiştir. – Wilt

+0

Veri yapısını kontrol ediyor musunuz Dejori David?Json verilerini oluştururken öğelerin kimliğine göre sıralanabilir misiniz? eğer öyleyse, üzerinde ikili arama uygulayabilirsiniz. – Klaus

cevap

0

mümkündür.

Eğer json veri yapısının kontrolünde misiniz bu

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

benzeri ve

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

Bu php

yılında json :)

0

Değişim bu kodu:

<?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']; 
    } 
?> 

sen ancak o zaman döngü için kullanılacak kod aşağıda kullanmayı düşünüyorsanız

<?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 
     } 
    } 
?> 

için:

<?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

Ayrıca "if" bloğunda bir "break;" ekleyin. Ne istediğini bulursan, döngüyü durdurmak için. – TiMESPLiNTER

+0

Bir dizi olarak kodu çözüldüğünde, "$ fruits" nesnesine başvuruyorsunuz. Bu hataları atar. – Darren

+1

@Darren, düzenleme için teşekkür ederiz. –

1

çözüm : Eğer daha sonra json yapısını değiştirebilirsem

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

See the example

+0

Benim oyımı alır, array_filter alternatifini seviyorum! – Darren

0

yardımcı olacaktır oluşturursanız? Eğer öyleyse, dizi anahtarıyla, ör.

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

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

echo $ fruits ['37 ']; // pear

İlgili konular