首页 > 解决方案 > 如何根据存储的值过滤数组?

问题描述

我想根据存储的字符串过滤数组。

array:3 [
  0 => "TEST_TEST1_ABC_20180920000000.txt"
  1 => "TEST_TEST2_ABC_20180920000000.txt"
  2 => "TEST_TEST1_EFG_20180920000000.txt"
 ]
//String format -> type_uniqueCode_outletCode_datetime.txt

TEST1 和 TEST2 是每个用户的唯一标识。每个用户可能有多个具有唯一插座代码的插座,但可能与其他用户相同。

如果选择 TEST1,预期结果如下

array:2 [
  0 => "TEST_TEST1_ABC_20180920000000.txt"
  1 => "TEST_TEST1_EFG_20180920000000.txt"
 ]

我该怎么做?是否可以进行条件检查以了解每个用户的插座是否附加到正确的唯一代码?

标签: phparrays

解决方案


您可以使用array_filter将数组的每个元素与您的测试字符串进行比较,例如

$array = [
  0 => "TEST_TEST1_ABC_20180920000000.txt",
  1 => "TEST_TEST2_ABC_20180920000000.txt",
  2 => "TEST_TEST1_EFG_20180920000000.txt"
];

$test = 'TEST1';
$newarr = array_filter($array, function ($v) use ($test) { return preg_match('/^[^_]+_' . preg_quote($test) . '_/', $v); });
print_r($newarr);

输出:

Array
(
    [0] => TEST_TEST1_ABC_20180920000000.txt
    [2] => TEST_TEST1_EFG_20180920000000.txt
)

我已经使用了该字段preg_matchtype部分可以是任意长度。i您还可以通过将修饰符添加到正则表达式来使搜索不区分大小写,即:

$newarr = array_filter($array, function ($v) use ($test) { return preg_match('/^[^_]+_' . preg_quote($test) . '_/i', $v); });

最后,如果您希望数组被索引0,1,...,只需使用array_values

print_r(array_values($newarr))

输出:

Array
(
    [0] => TEST_TEST1_ABC_20180920000000.txt
    [1] => TEST_TEST1_EFG_20180920000000.txt
)

推荐阅读