Php 使用usort对数组的动态头进行排序

Php 使用usort对数组的动态头进行排序,php,Php,我得到了以下数组,结果是 Loc L M S XS 001 2 3 3 1 006 0 2 3 1 012 2 2 2 2 我尝试按如下方式对该数组的标头进行排序: XS、S、M、L、XL(衣服尺寸从小到特大) 我已经了解了usort函数是如何与下面的示例代码一起工作的,但是我不知道如何在我的数组中实现它,因为我不知道如何识别数组L、M、S、XS中的键 样本: <?php $order = array("XS

我得到了以下数组,结果是

Loc    L    M   S   XS
001    2    3   3   1
006    0    2   3   1
012    2    2   2   2
我尝试按如下方式对该数组的标头进行排序: XS、S、M、L、XL(衣服尺寸从小到特大)

我已经了解了usort函数是如何与下面的示例代码一起工作的,但是我不知道如何在我的数组中实现它,因为我不知道如何识别数组L、M、S、XS中的键

样本:

<?php
$order = array("XS","S", "M", "L", "XL");
$array = array(
    array('id' => "M", 'title' => 'Some Title'),
    array('id' => "L", 'title' => 'Some Title'),
    array('id' => "S", 'title' => 'Some Title'),
    array('id' => "XL", 'title' => 'Some Title'),
);

usort($array, function ($a, $b) use ($order) {
    $pos_a = array_search($a['id'], $order);
    $pos_b = array_search($b['id'], $order);
    return $pos_a - $pos_b;
});

var_dump($array);
?>
我的php:

echo '<tr>';
//headers
foreach( $result as $key => $value )
{
    if( is_array($value) ) 
    { 
        foreach($value as $key => $column) {
            echo '  <th colspan="1" style="width: 30px">'.$key.'</th>';
        }
    }
    else 
    {
        echo '<th colspan="1">Niks</th>';
    }
    break;
}
echo '</tr>';
//Data
foreach( $result as $key => $value )
{
echo '<tr>';
    if( is_array($value) ) 
    { 
        foreach($value as $key => $column) {
            echo '<td>'.$column.'</td>';
        }
    }
    else 
    {
        echo '<td>'.$value.'</td>';
    }
echo '</tr>';
}
echo';
//标题
foreach($结果为$key=>$value)
{
if(是_数组($value))
{ 
foreach($key=>$column的值){
回显“.$key.”;
}
}
其他的
{
回声‘Niks’;
}
打破
}
回声';
//资料
foreach($结果为$key=>$value)
{
回声';
if(是_数组($value))
{ 
foreach($key=>$column的值){
回显“.$column.”;
}
}
其他的
{
回显“.$value.”;
}
回声';
}

我实际上不会为此使用
usort
。您可以根据该
$order
数组进行输出

$order = array("XS","S", "M", "L", "XL");
对于标题,只需迭代order数组并在
s中使用这些值

echo '<tr>';
//headers
foreach($order as $key)
{
    echo '  <th colspan="1" style="width: 30px">'.$key.'</th>';
}
echo '</tr>';
echo';
//标题
foreach($订单作为$key)
{
回显“.$key.”;
}
回声';
对于数据,迭代每行的order数组,并使用这些order值作为键来访问行中的值

//Data
foreach($result as $key => $row)
{
    echo '<tr>';
    foreach($order as $key) {
        echo '<td>' . ($row[$key] ?? '') . '</td>';
    }
    echo '</tr>';
}
//数据
foreach($key=>$row的结果)
{
回声';
foreach($订单作为$key){
回显“”。($row[$key]??“”);
}
回声';
}

为每一行构建一个模板数组,然后使用从每个项目中复制相关部分应该可以做到这一点

$result = Array
(
    Array
    (
        "Loc" => "001",
        "L" => 2,
        "M" => 3,
        "S" => 3,
        "XS" => 1
        ),
    Array
    (
        "Loc" => "006",
        "L" => 0,
        "M" => 2,
        "S" => 3,
        "XS" => 1
        ),
    Array
    (
        "Loc" => "012",
        "L" => 2,
        "M" => 2,
        "S" => 2,
        "XS" => 2
        )
    );

$order = array("Loc", "XS","S", "M", "L", "XL");
$order = array_fill_keys($order, 0);
$newResult = [];
foreach ( $result as $item )    {
    $newResult[] = array_replace($order, $item);
}
print_r($newResult);
输出

Array
(
    [0] => Array
        (
            [Loc] => 001
            [XS] => 1
            [S] => 3
            [M] => 3
            [L] => 2
            [XL] => 0
        )

    [1] => Array
        (
            [Loc] => 006
            [XS] => 1
            [S] => 3
            [M] => 2
            [L] => 0
            [XL] => 0
        )

    [2] => Array
        (
            [Loc] => 012
            [XS] => 2
            [S] => 2
            [M] => 2
            [L] => 2
            [XL] => 0
        )

)

你能帮助我如何在我的代码中实现这一点吗?当我只使用你的代码时,“位置代码”标题就消失了,我再也看不到数字服装尺寸(36、37、38等)。有人能帮我如何在代码中实现用户“不要惊慌”的解决方案吗?当我只使用你的代码时,“位置代码”标题就消失了,我再也看不到数字服装尺寸(36、37、38等)。谢谢!
Array
(
    [0] => Array
        (
            [Loc] => 001
            [XS] => 1
            [S] => 3
            [M] => 3
            [L] => 2
            [XL] => 0
        )

    [1] => Array
        (
            [Loc] => 006
            [XS] => 1
            [S] => 3
            [M] => 2
            [L] => 0
            [XL] => 0
        )

    [2] => Array
        (
            [Loc] => 012
            [XS] => 2
            [S] => 2
            [M] => 2
            [L] => 2
            [XL] => 0
        )

)