Попробуйте:
<?php
$arr = ['foo', 'foobar@gmail.com', 'myName', 'myInfo', 954];
$arrMask = ['/\d+/', '/\w+@\w+.\w+/', '/*/', '/*/', '/*/'];
print_r(sortArrayByExp($arr, $arrMask));
/**
* Sort a array by RegExp
*
* Sort a array by regular expression
*
* @param array $arr Array to sort
* @param array $arrRegExp Array to postion Regex
*
* @return array Return a new array mirrored by value in $arrRegExp
*
* @throws \InvalidArgumentException
*/
function sortArrayByExp($arr, $arrRegExp)
{
if(! is_array($arr))
throw new \InvalidArgumentException('Value in parameter $arr must be array!', 556);
if(! is_array($arrRegExp))
throw new \InvalidArgumentException('Value in parameter $arrRegExp must be array!', 557);
$newArray = [];
foreach($arrRegExp as $key => $mask)
{
if(! is_string($mask))
throw new \InvalidArgumentException('Each value in $arrRegExp must be string or RegExp', 558);
$response = null;
if(@preg_match($mask, '') !== false)
{
foreach($arr as $posArray => $value)
if(preg_match($mask, $value))
{
$response = $value;
unset($arr[$posArray]);
break;
}
}
if($response !== null)
$newArray[$key] = $response;
}
return $newArray;
}
/* output must be:
Array
(
[0] => 954
[1] => foobar@gmail.com
[2] => foo
[3] => myName
[4] => myInfo
)
*/
Эта функция сортирует массив по каждому значению в новом массиве, который содержит regular expression
, попробуйте мой пример здесь
Изменить 1:
Вы также можете использовать collect
из Laravel для сортировки массива, например:
<?php
require "vendor/autoload.php";
$myCollect = collect(['foo', 'foobar@gmail.com', 'myName', 'myInfo', 954]);
print_r($myCollect->sort(function($above, $below)
{
$belowIsId = is_numeric($below);
$aboveIsId = is_numeric($above);
$belowIsMail = preg_match('/\w+@\w+.[\w\.]+/', $below);
$aboveIsMail = preg_match('/\w+@\w+.[\w\.]+/', $above);
$pos = 0;
if($belowIsId)
$pos = 1;
elseif($belowIsMail)
$pos = 1;
elseif($aboveIsId || $aboveIsMail)
$pos = -1;
return $pos;
})->toArray());
/* output must be:
Array (
[4] => 954
[1] => foobar@gmail.com
[0] => foo
[2] => myName
[3] => myInfo
)
*/
См. Подробнее, как использовать метод sort
здесь , но посмотрите, что ключи сохранены, идентификатор первый, но ваш ключ в массиве все тот же