array_multisort 按辅助数组出现的顺序排序

问题描述 投票:0回答:2

我希望您能帮助我解决我所处的困境。假设以下数组

$_xm_anal
保存产品的尺寸/可用性信息:

Array
(
    [availability] => Array
        (
            [BLK] => Array
                (
                    [SIZE4] => 2
                    [SIZE8] => 1
                    [SIZE10] => 3
                    [SIZE14] => 8
                    [SIZE16] => 4
                    [SIZE19] => 12
                    [SIZE24] => 1
                )

        )

    [color_list] => Array
        (
            [BLK] => Array
                (
                    [0] => BLK
                    [COLORCODE] => BLK
                    [1] => BLACK
                    [ColorLANG] => BLACK
                )

        )

    [size_list] => Array
        (
            [ID] => 20
            [SIZE1] => 39
            [SIZE2] => 40
            [SIZE3] => 40.5
            [SIZE4] => 41
            [SIZE5] => 41.5
            [SIZE6] => 42
            [SIZE7] => 42.5
            [SIZE8] => 43
            [SIZE9] => 43.5
            [SIZE10] => 44
            [SIZE11] => 44.5
            [SIZE12] => 45
            [SIZE13] => 45.5
            [SIZE14] => 46
            [SIZE15] => 46.5
            [SIZE16] => 47
            [SIZE17] => 47.5
            [SIZE18] => 48
            [SIZE19] => 48.5
            [SIZE20] => 49
            [SIZE21] => 36
            [SIZE22] => 37
            [SIZE23] => 37.5
            [SIZE24] => 38
            [SIZE25] => 38.5
            [TitleLANG] => NO NO NO
        )

    [text_size] => Array
        (
            [SIZE4] => 41
            [SIZE8] => 43
            [SIZE10] => 44
            [SIZE14] => 46
            [SIZE16] => 47
            [SIZE19] => 48.5
            [SIZE24] => 38
        )

)

将上述数组转换为适当大小选项的 PHP 代码如下:

foreach ($_xm_anal["availability"][$Prod["color_code"]] as $k => $v) { ?> // $Prod["color_code"] equals to BLK in this example <? if ($v) { $hasSize = 1; ?> <li><a href="javascript:void(0)" class="system_selectSize chk_avail" data-storehouse="2" data-size="<?= $k ?>"> <?= $_xm_anal["size_list"][$k] ?></a></li> <? } else { ?> <li style="background:#f0eee8"><a href="javascript:void(0)" class="noqty"> <s><?= $_xm_anal["size_list"][$k] ?></s></a></li> <? } ?> <? } ?>
最终结果如下:

问题开始于他们以

未排序的方式添加尺寸,即尺寸38对应于键SIZE24,因此$_xm_anal['availability']['BLK']

需要根据其键以适当的顺序进行排序,这可以通过
$_xm_anal['text_size']
来确定

所以我编写了下面的代码,首先创建一个具有正确顺序的

$_xm_anal['availability']['BLK']

 键的数组:

$tmp = $_xm_anal['text_size']; asort($tmp); $tmp2 = array_keys($tmp);
这会产生数组 $tmp2 等于:

Array ( [0] => SIZE24 [1] => SIZE4 [2] => SIZE8 [3] => SIZE10 [4] => SIZE14 [5] => SIZE16 [6] => SIZE19 )
所以现在唯一的问题是我找不到正确的 

flag 在适当的 array_multisort

 中使用来根据该 
$_xm_anal
 数组整理初始 
$tmp2
 数组...

array_multisort($tmp2, SORT_NATURAL, $_xm_anal["availability"][$Prod["color_code"]]);
按照按键的顺序实际使用 

$tmp2

 的正确标志是什么?

php array-multisort
2个回答
0
投票
好吧,我能够对其进行有点间接/不太优雅的排序,但我想不出任何更好的解决方案......所以我这样做了:

$tmp = $_xm_anal['text_size']; asort($tmp); foreach ($tmp as $kkk => $vvv) { $tmp[$kkk]=$_xm_anal["availability"][$Prod["color_code"]][$kkk]; } $_xm_anal["availability"][$Prod["color_code"]] = $tmp;
如果有人能想到更优雅的解决方案,请随时发布! TIA


0
投票
要按值升序对

text_size

 子数组进行排序,并同步对相应的 
availability
 子数组进行排序,请将这两个数据点指定为 
array_multisort()
 调用的参数。

代码:(

演示

$Prod["color_code"] = 'BLK'; array_multisort( $_xm_anal['text_size'], $_xm_anal['availability'][$Prod["color_code"]] ); var_export($_xm_anal);
    
© www.soinside.com 2019 - 2024. All rights reserved.