【问题标题】:PHP foreach: Multiple conditional search in array decode from JSONPHP foreach:从 JSON 解码数组中的多个条件搜索
【发布时间】:2019-07-08 07:48:51
【问题描述】:

我在通过“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"]。

我的代码是这样的:

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), '</pre>';

但是输出是 [null 115_AFT CLN]... 我究竟做错了什么?我该如何解决它并有一些方法可以更快地搜索? (PHP 7.0)

【问题讨论】:

  • 好吧,首先,您之前是否在代码中定义了$lookup_main?因为此刻你从未定义它。据我了解,您也想返回$lookup_main。所以你可以return [$lookup_main, $item[$result_column]]; 而不是在你的$result 变量中硬编码它。如果你没有找到$lookup_sub,那么只需return [$lookup_main, false];
  • @RiggsFolly 感谢您的建议,我会阅读并修复它:)
  • @Frankich 这对我很有帮助,谢谢 :) 你对我的问题还有其他想法吗?

标签: php multidimensional-array foreach


【解决方案1】:

您可以将array_walkjson_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);

Working DEMO

【讨论】:

  • 感谢您简短而干净的回复,它解决了我的部分问题!但是array_walk的效率比PHP 7.3.1中的foreach好?
猜你喜欢
  • 1970-01-01
  • 2021-11-10
  • 2013-09-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-12-03
相关资源
最近更新 更多