array_map две функции обратного вызова как одна

Вот мои коды:

$sc = 'hello 8491241 some text 6254841 some text 568241 414844:412';
preg_match_all('/[0-9]{5,10}/', $sc, $matches1);
preg_match_all('/[0-9]{5,10}:[0-9]{1,5}/', $sc, $matches2);

function cub1($match)
{

return array(
'batch' => $match,
'type' => '1',
);

}

function cub2($match)
{
return array(
'batch' => $match,
'type' => '2',
);
}

$pr_matches1 = array_map('cub1', $matches1[0]);
$pr_matches2 = array_map('cub2', $matches2[0]);

$all_matches = array_merge($pr_matches1,$pr_matches2);

Это просто отлично работает, я спрашиваю, можно ли улучшить мои коды и сделать функции обратного вызова array_map (cub1 и cub2) как одну функцию (cub), мне просто нужно установить разные «типы» для $ match1 и $ match2

Любая идея, пожалуйста?

2

Решение

Да, это возможно, просто немного сложно определить в функции, из какого массива это происходит. Но это должно работать для вас:

(Здесь я просто использую strpos() определить, если это форма соответствия $matches1 или из $matches2, поскольку только второй массив может содержать :)

<?php

$sc = 'hello 8491241 some text 6254841 some text 568241 414844:412';
preg_match_all('/[0-9]{5,10}/', $sc, $matches1);
preg_match_all('/[0-9]{5,10}:[0-9]{1,5}/', $sc, $matches2);

function cub($m) {

if(strpos($m, ":") !== FALSE) {
return array(
'batch' => $m,
'type' => '2',
);
} else {
return array(
'batch' => $m,
'type' => '1',
);
}}

$all_matches = array_map("cub", array_merge($matches1[0], $matches2[0]));
print_r($all_matches);

?>

Выход:

Array ( [0] => Array ( [batch] => 8491241 [type] => 1 ) [1] => Array ( [batch] => 6254841 [type] => 1 ) [2] => Array ( [batch] => 568241 [type] => 1 ) [3] => Array ( [batch] => 414844 [type] => 1 ) [4] => Array ( [batch] => 414844:412 [type] => 2 ) )
3

Другие решения

Я бы упростил все это до этого:

$sc = 'hello 8491241 some text 6254841 some text 568241 414844:412';
preg_match_all('/([0-9]{5,10})(:[0-9]{1,5})?/', $sc, $matches, PREG_SET_ORDER);

$all_matches = array_reduce($matches, function (array $all, array $match) {
$all[] = ['batch' => $match[1], 'type'  => '1'];
if (isset($match[2])) {
$all[] = ['batch' => $match[0], 'type' => '2'];
}
return $all;
}, []);

Используйте необязательную группу захвата вместо двух отдельных регулярных выражений, тогда различение результатов обоих типов становится таким же простым, как проверка на существование группы захвата.

3

Некоторые функциональные вещи

$sc = 'hello 8491241 some text 6254841 some text 568241 414844:412';
preg_match_all('/[0-9]{5,10}/', $sc, $matches1);
preg_match_all('/[0-9]{5,10}:[0-9]{1,5}/', $sc, $matches2);

$my_matches[1] = $matches1[0];
$my_matches[2] = $matches2[0];

$cub[1] = function($match)
{
return array(
'batch' => $match,
'type' => '1',
);
};

$cub[2] = function($match)
{
return array(
'batch' => $match,
'type' => '2',
);
};

$result = call_user_func_array('array_merge', array_map(function($a, $b)
{ return array_map($a, $b); }, $cub, $my_matches));
var_dump($result);

демонстрация

Итак, вам нужно два массива произвольной (но одинаковой) длины: массив значений, массив обратных вызовов.

1
По вопросам рекламы [email protected]