PHP 数组按数据值分组

问题描述 投票:0回答:2

这是我的 $data 变量:

cv = 1,2,3,4,5:::cpt = 4,5 ...

现在我需要一些函数,我可以在其中添加数字作为参数(数字将是 $data 数值)。

例如。

function getPermission($id) {

... return $something;
}

然后,如果我像这样调用该函数:

echo getPermission(4);
,它将打印出数据“键”,其中 4 将作为值。

所以,要明确的是:

如果我这样调用函数:

echo getPermission(4);
输出将为“cv”和“cpt”。

但是如果我这样称呼它:

echo getPermission(1);

它只会输出“cv”,因为数字(1)位于 cv 键中。

希望大家理解,有不懂的地方请随时提问。

php arrays grouping
2个回答
4
投票
$str = 'cv = 1,2,3,4,5:::cpt = 4,5';
$tmp = explode(':::', $str);
$data = array();
foreach ($tmp as $arr) {
    $tokens = explode(' = ', $arr);
    $data[$tokens[0]] = explode(',', $tokens[1]);
}

print_r(getPermission(4, $data));
print_r(getPermission(1, $data));

function getPermission($id, $data) {
    $out = array();
    foreach ($data as $key => $arr) {
        if (in_array($id, $arr)) $out[] = $key;
    }
    return $out;
}

0
投票

如果此任务纯粹是将输入字符串解析为二维数组,则只需将三个冒号转换为换行符,解析 ini 字符串,然后对数组进行 csv 解析。

var_export(
    array_map(
        'str_getcsv',
        parse_ini_string(
            str_replace(':::', "\n", $data)
        )
    )
);

但是,如果要制作一个用户级函数来返回在子数组中找到传入整数的所有键,则需要更多迭代。

如果您想要一种直接技术来返回与包含传入整数的数字集相关的字符串,那么

preg_match_all()
可能是理想的选择。

匹配标签词,然后向前查找整个符合条件的数字。 演示

define('PERMS', 'cv = 1,2,3,4,5:::cpt = 4,5:::foo = 33');

function getPermission(int $id): array {
    preg_match_all("/\w+(?= = [^:]*\b$id\b)/", PERMS, $m);
    return $m[0] ?? [];
}

// run 7 tests
var_export(
    array_map(
        'getPermission',
        range(0, 6)
    )
);

输出:

array (
  0 => 
  array (
  ),
  1 => 
  array (
    0 => 'cv',
  ),
  2 => 
  array (
    0 => 'cv',
  ),
  3 => 
  array (
    0 => 'cv',
  ),
  4 => 
  array (
    0 => 'cv',
    1 => 'cpt',
  ),
  5 => 
  array (
    0 => 'cv',
    1 => 'cpt',
  ),
  6 => 
  array (
  ),
)
© www.soinside.com 2019 - 2024. All rights reserved.