Поиск значения в сложном массиве PHP - PullRequest
0 голосов
/ 23 мая 2018

Я просмотрел много постов о поиске значения из сложного массива, но все они доходят только до второго уровня.Может кто-нибудь, пожалуйста, предоставьте мне код, чтобы рекурсивно найти значение, например, состояние в address_line_2, существует или нет?

У меня есть следующий JSON

{
  "company": {
    "id": "123456",
    "name": "Test Company LLC.",
    "FEIN": "22-2222222",
    "address": {
      "address_line_1": {
        "street": "1 Street St, Suite 12",
        "city": "San Francisco",
        "postalCode": "123456"
      },
      "address_line_2": {
        "state": "CA",
        "country": "USA"
      }
    },
    "phone": "1-800-XXX-XXXX",
    "fax": "1-800-XXX-XXXX",
    "email": "admin@abc.com",
    "URL": "www.abc.com"
  },
  "producer": {
    "id": "LLXXXX",
    "name": "Test Name",
    "phone": "555-555-5555",
    "mobile": "555-555-5555",
    "fax": "555-555-5555",
    "email": "test@abc.com",
    "producerSubCode": "111",
    "NIPRId": "123456",
    "stateProducerId": "12344"
  }
}

~ Harshit

Ответы [ 3 ]

0 голосов
/ 23 мая 2018

Вместо создания массива.А как насчет анализа его как строки с регулярным выражением?

$find = "San Francisco";
$re = '/(' . $find . ')\":\s\"(.*?)\"|\"(\w+)\":\s\"(' . $find . ')/m';
$str = '{ "company": { "id": "123456", "name": "Test Company LLC.", "FEIN": "22-2222222", "address": { "address_line_1": { "street": "1 Street St, Suite 12", "city": "San Francisco", "postalCode": "123456" }, "address_line_2": { "state": "CA", "country": "USA" } }, "phone": "1-800-XXX-XXXX", "fax": "1-800-XXX-XXXX", "email": "admin@abc.com", "URL": "www.abc.com" }, "producer": { "id": "LLXXXX", "name": "Test Name", "phone": "555-555-5555", "mobile": "555-555-5555", "fax": "555-555-5555", "email": "test@abc.com", "producerSubCode": "111", "NIPRId": "123456", "stateProducerId": "12344" } }';

preg_match_all($re, $str, $matches);

$result["key-match"] = array_slice(array_column($matches, 0),1,2);
$result["value-match"] = array_slice(array_column($matches, 0),3,2);
var_dump($result);

$find может быть либо ключом, либо значением.
В массиве результатов будут содержаться два подмассива с указанием совпадения ключа или значения.

https://3v4l.org/05dm3

0 голосов
/ 23 мая 2018
<?php

$json_string = '{"company":{"id":"123456","name":"Test Company LLC.","FEIN":"22-2222222","address":{"address_line_1":{"street":"1 Street St, Suite 12","city":"San Francisco","postalCode":"123456"},"address_line_2":{"state":"CA","country":"USA"}},"phone":"1-800-XXX-XXXX","fax":"1-800-XXX-XXXX","email":"admin@abc.com","URL":"www.abc.com"},"producer":{"id":"LLXXXX","name":"Test Name","phone":"555-555-5555","mobile":"555-555-5555","fax":"555-555-5555","email":"test@abc.com","producerSubCode":"111","NIPRId":"123456","stateProducerId":"12344"}}';

$json_array = json_decode($json_string,true);

function getData($json_array,$search_value){
    foreach($json_array as $each_key => $each_value){
        if($each_key === $search_value) return true;
        if(is_array($each_value)){
            $return_value = getData($each_value,$search_value);
            if($return_value !== false) return $return_value === true ? $return_value : $each_key."=>".$return_value;
        }else if($each_value === $search_value){
            return $each_key;
        }
    }

    return false;
}

echo "<pre>";
var_dump(getData($json_array,'San Francisco'));
var_dump(getData($json_array,'producerSubCode'));
var_dump(getData($json_array,'abc123'));

ВЫХОД

string(38) "company=>address=>address_line_1=>city"
bool(true)
bool(false)

ПОЛОЖЕНИЯ

Каждый ключ и значение уникальны в массиве.

ОПРЕДЕЛЕНИЕ ФУНКЦИЙ

Функция getData() ищет заданную строку в массиве.

  • Если строка является key, она возвращает логическое значение true
  • Если строка является value в массиве, она возвращаетkey.
  • Если строка не является ни key, ни value, она возвращает логическое значение false.
0 голосов
/ 23 мая 2018

вы можете использовать array_column , чтобы получить значение заданного ключа

$ array = json_decode ($ json, true);

$ names = array_column ($ array, 'имя');

...