PHP foreach: множественный условный поиск в массиве декодирования из JSON - PullRequest
0 голосов
/ 08 июля 2019

У меня есть некоторая проблема в создании функции с помощью 'foreach', чтобы вернуть желаемый результат. Мой пример массива декодирования данных из JSON:

$json_string = 
'{"010_INICHK": [
        {
          "Symbol1": "01",
          "Symbol2": "",
          "Desc": "000_Start"
        },
        {
          "Symbol1": "",
          "Symbol2": "0701",
          "Desc": "010_Exchange"
        },
        {
          "Symbol1": "87",
          "Symbol2": "",
          "Desc": "025_MEASURE}
],
"020_PROCESS1": [
        {
          "Symbol1": "69",
          "Symbol2": "",
              "Desc": "000_REDO CLN"
        },
        {
          "Symbol1": "",
          "Symbol2": "6341",
          "Desc": "115_AFT CLN"
        }
        ],
"030_PROCESS2": [
        {
          "Symbol1": "75",
          "Symbol2": "",
          "Desc": "010_MT Load"
        },
        {
          "Symbol1": "",
          "Symbol2": "6341",
          "Desc": "020_AFT Load CLN"
        }
    ]
}'

Моя логика поиска:

 1. use "lookup_main" to search 010_INICHK, 020_PROCESS1 or 030_PROCESS2, if found go to step 2. else return "UNDefine".
 2. Then use "lookup_sub"(4 digits) to search "Symbol2" in 010_INICHK, 020_PROCESS1 or 030_PROCESS2 (depends on result in step 1.) if not find, use "lookup_sub"(first 2 digits) search "Symbol1".
 3. If found, return array ['lookup_main', "Desc" value] else return "UNDefine"

Например ,

Я хочу использовать ['030_PROCESS2', '6341'], чтобы найти и вернуть ['030_PROCESS2', "020_AFT Load CLN"].

Мой код такой:

<code>function vlookup($lookup_main, $lookup_sub, $lookup_array, $lookup_column, $result_column){

if ($lookup_main == $look_array[0]){
    foreach($lookup_array as $item_array){
        foreach($item_array as $item){

            if ($item[$lookup_column] == $lookup_sub) {
                return $item[$result_column];
            }elseif($item[$lookup_column] == substr($lookup_sub,0,2){
                return $item[$result_column];
            }else{
                echo 'UNDefine'; //undefine step
            }
        }
    }
}else{
    echo 'UNDefine';
}
return false;
}

$data = json_decode($json_string, true);
$result = array($lookup_main, vlookup('030_UBM1', '6341', $data, 'Symbol2','Desc'));
echo '<pre>', print_r($result, true), '
';

Но вывод равен [null 115_AFT CLN] ... Что я делаю неправильно? Как я могу это исправить и как-то быстрее искать? (PHP 7.0)

1 Ответ

0 голосов
/ 08 июля 2019

Можно использовать array_walk с json_decode

$jArr   = json_decode($json_string, true);
$search =  ['030_PROCESS2', '6341'];
$r = [];
array_walk($jArr, function($v, $k) use ($search, &$r){
  ($search[0] == $k) ? ($r[0] = $k AND array_walk($v, function($v1, $k1) use ($search, &$r){
    ($search[1] == $v1['Symbol2']) ? ($r[1] = $v1['Desc']) : ($r[0] = 'UNDefine');
})) : ($r[0] = 'UNDefine');
});
echo implode(',',$r);

Рабочая ДЕМО

...