隔离值与2D数组的多个列中的隔离值,然后对值排序

问题描述 投票:0回答:2
以字母顺序排序的数组排序未正确输出。 IT输出为:

Demo qwerty Demo3 Test1 Test2 New1

instead:

Demo
Demo3
New1
qwerty
Test1
Test2

代码:

$dbresults = array(
    "0" => array (
        "id" => "1",
        "cb_boutiquename1" => "Test1",
        "cb_boutiquename2" => "Test2",
        "cb_boutiquename3" => "New1"
    ),
    "1" => array (
        "id" => "2",
        "cb_boutiquename1" => "Demo",
        "cb_boutiquename2" => "qwerty",
        "cb_boutiquename3" => "Demo3"
    )
);
           
function sortarray($a, $b) {
    return strcmp($a["cb_boutiquename$i"], $b["cb_boutiquename$i"]);
    }

    usort($dbresults, "sortarray");

    while (list($key, $value) = each($dbresults)) {
        $results[] = $value ;
    }
    
    foreach($results as $result) {
        $i = 1;
        while (array_key_exists("cb_boutiquename$i", $result)) {
        if ($result["cb_boutiquename$i"] !='') {
            echo '<a href=' . cbSef( 'index.php?option=com_comprofiler&task=page&user=' . (int) $result['id'] . '&b=' . $i . getCBprofileItemid( false )) . '>' . $result["cb_boutiquename$i"] . '</a><br />';
        }
        ++$i;
    }
}

您的问题是在这里:
function sortarray($a, $b) {
    return strcmp($a["cb_boutiquename$i"], $b["cb_boutiquename$i"]);
}
php arrays sorting multidimensional-array merging-data
2个回答
1
投票
$ i是不确定的,因此您基本上是将一个不确定的阵列偏移与另一个不确定的阵列偏移进行比较。

如果您想指定在运行时指定的CB_BOUTIQUENAME字段中的哪一个,那么您可能想做的就是将$ i包含在功能中,在php上,可以使用返回闭合的函数来完成(PHP 5.3+)。

function getSorter($idx){
       return function($a, $b) use ($idx) {
           return strcmp($a["cb_boutiquename$idx"], $b["cb_boutiquename$idx"]);
       };
}
this返回一个关闭所提供的参数的函数,适用于用作用户的比较功能。因此,您将使用您的来电:

usort($dbresults, getSorter(1));

或更通用的解决方案,该解决方案不假定可以将其更改为
的属性上的cb_boutiquename前缀

function getSorter($idx){ return function($a, $b) use ($idx) { return strcmp($a[$idx], $b[$idx]); }; } usort($dbresults, getSorter("cb_boutiquename1"));

这将允许您按一个索引对任何数组进行排序。

update

我完全误解了这项练习的目标。您要做的是在进行任何分类之前将阵列弄平。
    $dbresults= array ( "0"  => array ( "id" => "1",
                          "cb_boutiquename1" => "Test1",
                          "cb_boutiquename2" => "Test2",
                          "cb_boutiquename3" => "New1"
                             ),
          "1" => array ( "id" => "2",
                          "cb_boutiquename1" => "Demo",
                          "cb_boutiquename2" => "qwerty",
                          "cb_boutiquename3" => "Demo3"
                             )
        );

// flatten out the array
$results = array();
foreach($dbresults as $k=>$v){
    foreach ($v as $key=>$value) {
          if (substr($key, 0,15) == "cb_boutiquename"){
              $results[] = array("id"=>$v["id"], "cb_boutiquename"=>$value, "i"=>substr($key, 15));
          }
    }

}

usort($results, function($a, $b){ return strcasecmp($a["cb_boutiquename"], $b["cb_boutiquename"]); });
foreach($results as $result){
    echo '<a href=' . cbSef( 'index.php?option=com_comprofiler&task=page&user=' . (int) $result['id'] . '&b=' . $result["i"] . getCBprofileItemid( false )). '>' . $result["cb_boutiquename"] . '</a><br />'."\n";
}

启用您的sortarray

功能,简单地使用以下操作:

0
投票

无需重新发明轮子。阅读有关它的

最新问题
© www.soinside.com 2019 - 2025. All rights reserved.