根据包含管道的键值筛选数组


filter an array by key value that has pipes in it

我有一个表单,它需要过滤用户输入的搜索结果。我不是这个表格的最初设计者。这是我看到的两种过滤结果的方法之一。A)我本可以尝试将sql查询限制为选定的代码或B)过滤返回的结果。

我试过了

var_dump(array_intersect_key($array1, $array2));

不成功:

Array1看起来像这样:

array (
        '|00006|5' => array('pid' => 111
                'provider_id' => 123456 )  
        '|93000|34' => array('pid' => 112
                'provider_id' => 127654 )
        '|93225|1' => array('pid' => 113
                'provider_id' => 127893 )

)

我弄清楚了管道是如何进入键值的,我试图调整我的键来匹配,但这也不起作用。

关于我如何过滤这些类型的结果与一个键,不是一个单一的值,是动态变化的建议?

  99232 => string '99232' (length=5)
  85610 => string '85610' (length=5)
  93970 => string '93970' (length=5)
  93000 => string '93000' (length=5)
  99406 => string '99406' (length=5)
  99215 => string '99215' (length=5)

我使键值和字符串值相同,试图设置某种类型的过滤。但是由于array1中的第三个值将在while子句中动态传递。我没有办法将这个数字与Array2匹配。

我的预期结果是

    array (
        '|93000|34' => array('pid' => 112
                'provider_id' => 127654 )
       )

因为6个输入中只有一个匹配array1的值

你必须定义键比较函数,然后使用array_intersect_ukey():

$a = array (
        '|00006|5' => array('pid' => 111,
                'provider_id' => 123456 ),
        '|93000|34' => array('pid' => 112,
                'provider_id' => 127654 ),
        '|93225|1' => array('pid' => 113,
                'provider_id' => 127893 ),
);
$b = array('93000' => '93000');
print_r(array_intersect_ukey($a, $b, function($ka, $kb) {
        if ($ka[0] == '|') {                     // transform key
                $ka = substr($ka, 1, strrpos($ka, '|') - 1);
        }
        if ($kb[0] == '|') {                     // transform key
                $kb = substr($kb, 1, strrpos($kb, '|') - 1);
        }
        // perform regular comparison
        return strcmp($ka, $kb);
}));

或者您可以这样做。祝你好运:)

$parsed1 = array();
foreach($array1 as $key => $value) {
    $splited = explode("|", $key);
    $parsed1[$splited[1]] = $value;
}
var_dump(array_intersect_key($parsed1,$array2));