代码之家  ›  专栏  ›  技术社区  ›  Crazy

如何根据存储的值过滤数组?

  •  0
  • Crazy  · 技术社区  · 6 年前

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

    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"
     ]
    

    我怎样才能做到这一点,有没有可能做条件检查,以了解每个用户的出口是否附加到正确的唯一代码?

    1 回复  |  直到 6 年前
        1
  •  3
  •   Nick SamSmith1986    6 年前

    你可以用 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_match 所以 type 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
    )