按包含$b的$a排序字符串


sorting strings by $a containing $b

我正在编写一个模块,将部分文本替换为其他文本。这是一个web应用程序的"重命名"功能。因为我可能将"Actions"重命名为"abcii",将"Action"重命名为"abci",所以我需要排序,以便包含其他替换短语的短语在它们包含的短语之前在数组中。

带示例的代码

private function sortStringContainment($a, $b)
{
    if ($a == $b){
        return 0;
    }
    return ( stripos( $a, $b ) !== false ) ? -1 : 1;
}
$data = "a:14:{s:7:"Purpose";a:2:{s:11:"defaultName";s:7:"Purpose";s:11:"customLabel";s:9:"Purpose23";}s:6:"Vision";a:2:{s:11:"defaultName";s:6:"Vision";s:11:"customLabel";s:7:"Vision2";}s:18:"Vision Goal (bhag)";a:2:{s:11:"defaultName";s:18:"Vision Goal (bhag)";s:11:"customLabel";s:3:"VG2";}s:17:"Vision Milestones";a:2:{s:11:"defaultName";s:17:"Vision Milestones";s:11:"customLabel";s:3:"VM2";}s:13:"Core Strategy";a:2:{s:11:"defaultName";s:13:"Core Strategy";s:11:"customLabel";s:3:"CS2";}s:4:"Goal";a:2:{s:11:"defaultName";s:4:"Goal";s:11:"customLabel";s:5:"Goal2";}s:5:"Goals";a:2:{s:11:"defaultName";s:5:"Goals";s:11:"customLabel";s:6:"Goals2";}s:9:"Milestone";a:2:{s:11:"defaultName";s:9:"Milestone";s:11:"customLabel";s:10:"Milestone2";}s:10:"Milestones";a:2:{s:11:"defaultName";s:10:"Milestones";s:11:"customLabel";s:11:"Milestones2";}s:15:"Annual Strategy";a:2:{s:11:"defaultName";s:15:"Annual Strategy";s:11:"customLabel";s:3:"AS2";}s:6:"Action";a:2:{s:11:"defaultName";s:6:"Action";s:11:"customLabel";s:7:"Action2";}s:7:"Actions";a:2:{s:11:"defaultName";s:7:"Actions";s:11:"customLabel";s:8:"Actions2";}s:4:"Task";a:2:{s:11:"defaultName";s:4:"Task";s:11:"customLabel";s:5:"Task2";}s:5:"Tasks";a:2:{s:11:"defaultName";s:5:"Tasks";s:11:"customLabel";s:6:"Tasks2";}}";
ksort( $data );
array_reverse( $data );
uksort ( $data, 'sortStringContainment' );
print_r( $data );

我不明白为什么"Tasks"总是在"Task"后面,我需要它在它前面。

根据@zerkms的建议,我从http://www.codecodex.com/wiki/Merge_sort#PHP

调整了合并排序

导致以下代码

function merge_sort(&$arrayToSort)
{
    if (sizeof($arrayToSort) <= 1)
        return $arrayToSort;
    // split our input array into two halves
    // left...
    $leftFrag = array_slice($arrayToSort, 0, (int)(count($arrayToSort)/2));
    // right...
    $rightFrag = array_slice($arrayToSort, (int)(count($arrayToSort)/2));
    // RECURSION
    // split the two halves into their respective halves...
    $leftFrag = merge_sort($leftFrag);
    $rightFrag = merge_sort($rightFrag);
    $returnArray = merge($leftFrag, $rightFrag);
    return $returnArray;
}

function merge(&$lF, &$rF)
{
    $result = array();
    // while both arrays have something in them
    while (count($lF)>0 && count($rF)>0) {
        if (stripos( $lF[0], $rF[0] ) !== false) {
            array_push($result, array_shift($lF));
        }
        else {
            array_push($result, array_shift($rF));
        }
    }
    // did not see this in the pseudo code,
    // but it became necessary as one of the arrays
    // can become empty before the other
    array_splice($result, count($result), 0, $lF);
    array_splice($result, count($result), 0, $rF);
    return $result;
}
$data = "a:14:{s:7:"Purpose";a:2:{s:11:"defaultName";s:7:"Purpose";s:11:"customLabel";s:9:"Purpose23";}s:6:"Vision";a:2:{s:11:"defaultName";s:6:"Vision";s:11:"customLabel";s:7:"Vision2";}s:18:"Vision Goal (bhag)";a:2:{s:11:"defaultName";s:18:"Vision Goal (bhag)";s:11:"customLabel";s:3:"VG2";}s:17:"Vision Milestones";a:2:{s:11:"defaultName";s:17:"Vision Milestones";s:11:"customLabel";s:3:"VM2";}s:13:"Core Strategy";a:2:{s:11:"defaultName";s:13:"Core Strategy";s:11:"customLabel";s:3:"CS2";}s:4:"Goal";a:2:{s:11:"defaultName";s:4:"Goal";s:11:"customLabel";s:5:"Goal2";}s:5:"Goals";a:2:{s:11:"defaultName";s:5:"Goals";s:11:"customLabel";s:6:"Goals2";}s:9:"Milestone";a:2:{s:11:"defaultName";s:9:"Milestone";s:11:"customLabel";s:10:"Milestone2";}s:10:"Milestones";a:2:{s:11:"defaultName";s:10:"Milestones";s:11:"customLabel";s:11:"Milestones2";}s:15:"Annual Strategy";a:2:{s:11:"defaultName";s:15:"Annual Strategy";s:11:"customLabel";s:3:"AS2";}s:6:"Action";a:2:{s:11:"defaultName";s:6:"Action";s:11:"customLabel";s:7:"Action2";}s:7:"Actions";a:2:{s:11:"defaultName";s:7:"Actions";s:11:"customLabel";s:8:"Actions2";}s:4:"Task";a:2:{s:11:"defaultName";s:4:"Task";s:11:"customLabel";s:5:"Task2";}s:5:"Tasks";a:2:{s:11:"defaultName";s:5:"Tasks";s:11:"customLabel";s:6:"Tasks2";}}";
$sortValues = array_keys( $data );
$this->merge_sort( $sortValues );
$sortValues = array_reverse( $sortValues );
$returnData = array();
foreach ($sortValues as $value){
    $returnData[$value] = $data[$value];
}
$data = $returnData;
print_r( $data );