2016-11-26 48 views
0

我有一个数组,如:排序PHP阵列(使用SUBSTR(“字符串”, - 3,1)功能)

$unsorted = Array(
"0" =>"3470U11", 
"1" =>"3470E11", 
"2" =>"3470S13", 
"3" =>"3470G11", 
"4" =>"3470S12", 
"5" =>"3470S11", 
"6" =>"3470E12", 
"7" =>"3470U12", 
"8" =>"3470G13", 
"9" =>"3470G12", 
"10" =>"3470E13", 
"11" =>"3470U13" 
); 

$sortBy = array('G','D','S','U','E','T','A','L'); 

我需要由substr($value,-3,1)的顺序对数组进行排序在$sortBy上市所以结果就变成这样:

$sorted = Array(
"0" => "3470G11", 
"1" => "3470G12", 
"2" => "3470G13", 
"3" => "3470S11", 
"4" => "3470S12", 
"5" => "3470S13", 
"6" => "3470U11", 
"7" => "3470U12", 
"8" => "3470U13", 
"9" => "3470E11", 
"10" =>"3470E12", 
"11" =>"3470E13" 
); 
+3

请看'uasort()' – Rizier123

回答

0

usort

(PHP 4,PHP 5,PHP 7) usort - 按使用一个用户定义的比较函数值的数组

<?php 
 
$unsorted = Array(
 
"0" =>"3470U11", 
 
"1" =>"3470E11", 
 
"2" =>"3470S13", 
 
"3" =>"3470G11", 
 
"4" =>"3470S12", 
 
"5" =>"3470S11", 
 
"6" =>"3470E12", 
 
"7" =>"3470U12", 
 
"8" =>"3470G13", 
 
"9" =>"3470G12", 
 
"10" => "s3470E13", 
 
"11" => "s3470U13" 
 
); 
 

 
//$a and $b -> two elts of the array 
 
function cmp ($a,$b){ 
 

 
\t $substring_a = substr($a, -3,1); 
 
\t $substring_b = substr($b, -3,1); 
 
\t 
 
\t $sortArr = array('G','D','S','U','E','T','A','L'); 
 
\t 
 
\t $key_a = array_search($substring_a, $sortArr); 
 
\t $key_b = array_search($substring_b, $sortArr); 
 
\t 
 
\t if($key_a == $key_b){ 
 
\t \t return strcmp(substr($a, -2),substr($b, -2)); 
 
\t \t 
 
\t } \t 
 
\t return $key_a > $key_b; 
 

 
} 
 

 
usort($unsorted, "cmp"); 
 
print_r($unsorted);

-1

试试这个:PHP usort()将适用于

<?php 
    $sortBy_Index = array_flip($sortBy); 
    sort($data, SORT_STRING); 
    $FlippedData = array_flip($data); 
    $compare = function($a, $b) use (&$sortBy_Index, &$FlippedData) { 
     $aid = substr($a, -3, 1);$bid = substr($b, -3, 1); 
     $ai = $sortBy_Index[$aid];$bi = $sortBy_Index[$bid]; 

     if ($ai === null and $bi === null) { 
      return $FlippedData[$aid] - $FlippedData[$bid]; 
     } 
     if ($ai === null) { return 1; } 
     if ($bi === null) { return -1; } 

     return $ai - $bi; 
    }; 
    usort($data, $compare); 
    echo "<pre>";print_r($data);exit; 
?> 

输出

Array 
(
    [0] => 3470G11 
    [1] => 3470G12 
    [2] => 3470G13 
    [3] => 3470S11 
    [4] => 3470S12 
    [5] => 3470S13 
    [6] => 3470U11 
    [7] => 3470U12 
    [8] => s3470U13 
    [9] => 3470E11 
    [10] => 3470E12 
    [11] => s3470E13 
) 
+0

是否有任何downvote的原因? –

0

您可以使用用户定义的排序时比较功能。 usort()如果要将索引重新排列或如果要保留键的原样,请使用 uasort()

回调函数可以是这样的:

public function sortCallback($item1, $item2){ 
    $orderArr = array('G','D','S','U','E','T','A','L'); 

    $iItem1 = array_search(substr($item1,-3,1), $orderArr); 
    $iItem2 = array_search(substr($item2,-3,1), $orderArr); 

    if($iItem1 == $iItem2){ 
      return 0; 
    } 

    return ($iItem1 < $iItem2) ? -1 : 1; 
} 

参见php.net:

+0

为什么downvote?如果你downvote,请发表评论 –

+0

是的,我同意 –

-1

尝试此代替

sort($unsorted); 
$result=array(); 
foreach ($sortArr as $sortBy) { 
foreach ($unsorted as $value) { 
if(strpos($value, $sortBy)!==false){ 
$result[]=$value; 
}}} 
print_r($result); 
0

尝试像这样的东西....

$unsorted = Array(
     "0" =>"3470U11", 
     "1" =>"3470E11", 
     "2" =>"3470S13", 
     "3" =>"3470G11", 
     "4" =>"3470S12", 
     "5" =>"3470S11", 
     "6" =>"3470E12", 
     "7" =>"3470U12", 
     "8" =>"3470G13", 
     "9" =>"3470G12", 
     "10" => "s3470E13", 
     "11" => "s3470U13" 
    ); 

    $sortArr = array('G','D','S','U','E','T','A','L'); 

    foreach ($sortArr as $key => $value) { 
     foreach ($unsorted as $key1 => $value1) { 
      $val = substr($value1,-3,1); 
      if ($val === $value) { 
       $sortArrFin[] = $value1; 
      } 
     } 
    } 
    foreach ($sortArrFin as $key3 => $value3) { 
     $val1 = substr($value3,-2); 
     $newSortArr[] = $val1; 
    } 
    sort($newSortArr); 
    $uniqueArr = array_unique($newSortArr); 
    foreach ($uniqueArr as $key4 => $value4) { 
     foreach ($sortArrFin as $key5 => $value5) { 
      $val2 = substr($value5,-2); 
      if ($val2 === $value4) { 
       $Final[] = $value5; 
      } 
     } 
    } 
    foreach ($sortArr as $key6 => $value6) { 
     foreach ($Final as $key7 => $value7) { 
      $val3 = substr($value7,-3,1); 
      if ($val3 === $value6) { 
       $Last[] = $value7; 
      } 
     } 
    } 
    echo "<pre>"; 
    print_r($Last);