Sort PHP Array based on another Array (using substr(“String”,-3,1) function)

旧时模样 提交于 2020-01-07 05:43:29

问题


I have an array like:

$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');

I need to sort the array by the substr($value,-3,1) in the order listed in $sortBy so the result becomes like:

$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"
);

回答1:


usort

(PHP 4, PHP 5, PHP 7) usort — Sort an array by values using a user-defined comparison function

<?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);



回答2:


You can use a user defined compare function when sorting. usort() if you want the indexes to be rearanged or uasort() if you want to keep the keys as they are.

Your callback function can be something like this:

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;
}

See on php.net:

  • usort();
  • uasort();
  • array_search();



回答3:


Try to someting like this....

$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);



回答4:


try this : PHP usort() will the suitable for that

<?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;
?>

OUTPUT

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
)



回答5:


try this instead

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


来源:https://stackoverflow.com/questions/40816754/sort-php-array-based-on-another-array-using-substrstring-3-1-function

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!