Поиск объекта в массиве

148
27 декабря 2017, 21:38

Доброго времени суток, форумчане! У меня возникла проблема, у меня есть вот такой JSON файл:

{
  "terminals": [
    {
      "token": "hile_abcd1234",
      "name": "Hile Group Authorized Agent",
      "scopes": [
        "r"
      ]
    },
    {
      "token": "hile_absd1234",
      "name": "Hile Group Authorized Agent 2",
      "scopes": [
        "w"
      ]
    }
  ]
}

Мне нужно найти токен hile_absd1234 и вернуть массив в котором он находится. Как это сделать?

Answer 1
$arr = json_decode($string, true);
$res = array_filter($arr['terminals'], 
            function($x) { return $x['token'] == 'hile_absd1234'; }); 

demo

Answer 2

да вроде ничего сложного?

$json = '{"terminals":[{"token":"hile_abcd1234","name":"Hile Group Authorized Agent","scopes":["r"]},{"token":"hile_absd1234","name":"Hile Group Authorized Agent 2","scopes":["w"]}]}';
$data = json_decode($json, true);
$result = null;
$needle = "hile_absd1234";
foreach($data['terminals'] as $t){
    if($t['token'] === $needle){
        $result = $t;
        break;
    }    
}
print_r($result);

как уже описано у @splash58, можно использовать array_filter, однако тут в результате будет массив, внутри которого - искомый результат. Альтернативой может стать array_reduce

$result = array_reduce($data['terminals'], function($carry, $item) use ($needle){
             if($item['token'] === $needle){
                $carry = $item;
             }
             return $carry;
          });
print_r($result);

он вернет сразу искомый массив.

недостатком обоих функций массивов в том, что они просмотрят весь массив полностью, в то время как в цикле мы можем сделать break после нахождения элемента.

Answer 3

Ещё вариант в коллекцию:

$need = 'hile_absd1234';
$result = [];
$array = json_decode($string, true);
foreach ($array as $arr) {
    foreach ($arr as $k => $v) {
        if ($v['token'] == $need) {
            $result[] = $arr[$k];
        }
    }
}
echo '<pre>', print_r($result, true), '</pre>';
READ ALSO
Записать значение переменной один раз

Записать значение переменной один раз

Как записать значение переменной в сессию/куки только 1 раз без перезаписи? Обновляется страница 3 раза и прилетают 3 разных значения в cookie

163
Функция для работы с массивами PHP

Функция для работы с массивами PHP

какой функцией для работы с массивами можно заменить foreach в таком коде

155
Числа с плавающей точкой в нормальный формат

Числа с плавающей точкой в нормальный формат

ЗдравствуйтеРаботаю с bitcoin через json-rpc

171