基于另一个数组排序PHP数组(使用substr(" String", - 3,1)函数)

时间:2016-11-26 09:13:32

标签: php arrays sorting

我有一个像:

这样的数组
$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"
);

5 个答案:

答案 0 :(得分: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:

答案 1 :(得分:0)

<强> usort

(PHP 4,PHP 5,PHP 7) usort - 使用用户定义的比较函数按值对数组进行排序

&#13;
&#13;
<?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){

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

}

usort($unsorted, "cmp");
print_r($unsorted);
&#13;
&#13;
&#13;

答案 2 :(得分: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);

答案 3 :(得分:-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
)

答案 4 :(得分:-1)

试试这个

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