繁体   English   中英

对PHP中的子键值排序多级数组

[英]Sort multilevel array on sub key value in PHP

我想按price值的升序对多级数组进行排序。

{
    "pData": [
    {
        "name": "Walmart",
        "address": "Full Address for Walmart",
        "pricing": [{
            "id": "Samsung Galaxy 21M",
            "price": 157.0,
        }],
    },
    {
        "name": "Stop & Shop",
        "address": "Full Address for Stop & Shop",
        "pricing": [{
            "id": "Samsung Galaxy 21M",
            "price": 142.0,
        }],
    },
    {
        "name": "Safeway",
        "address": "Full Address for Safeway",
        "pricing": [{
            "id": "Samsung Galaxy 21M",
            "price": 148.0,
        }],
    }
    ],
    "status ":" ok "
}

我尝试了下面的代码,但给出了相同的结果,而没有对price键的值进行排序。 我什至在这个网站上尝试了许多来自不同答案的类似代码,但都没有工作。 所以请告知我的代码有什么问题或建议完全不同的代码。

function cmp($a, $b)
{
    //if ($a["price"] == $b["price"]) // Try #1
    if($a["pData"]["pricing"]["price"] == $b["pData"]["pricing"]["price"]) // Try #2
    {
        return 0;
    }
    return ($a["price"] < $b["price"]) ? -1 : 1; // Try #1
    return ($a["pData"]["pricing"]["price"] < $b["pData"]["pricing"]["price"]) ? -1 : 1;
}

usort($result,"cmp");
print_r($result);

你应该非常接近你所拥有的。 您不需要回调中的 pData 索引,而是将 $result['pData'] 传递给 usort。

function cmp($a, $b)
{
    if ($a["pricing"][0]["price"] == $b["pricing"][0]["price"])
    {
        return 0;
    }

    return ($a["pricing"][0]["price"] < $b["pricing"][0]["price"]) ? -1 : 1;
}

usort($result["pData"],"cmp");
print_r($result);

我刚刚注意到您在定价元素中有一个对象数组,因此以当前形式对 pData 元素进行排序将有问题。 您可能希望首先将所有定价元素提取到一个单独的数据结构中,然后对该新结构进行排序。 像这样的事情可能会帮助您获得更好的工作解决方案:

$tmp = array();
foreach ($result["pData"] as $pData) {
    foreach ($pData["pricing"] as $pricing) {
        $tmp[] = array(
            "name" => $pData["name"],
            "address" => $pData["address"],
            "id" => $pricing["id"],
            "price" => $pricing["price"]
        );
    }
}

function cmp($a, $b)
{
    if ($a["price"] == $b["price"])
    {
        return 0;
    }

    return ($a["price"] < $b["price"]) ? -1 : 1;
}

usort($tmp,"cmp");
print_r($tmp);

您可以使用飞船运算符<=>也称为三向比较运算符。

usort($result["pData"], function ($a, $b) {
    return $a["pricing"][0]["price"] <=> $b["pricing"][0]["price"];});

对于带有箭头功能的 PHP 7.4。

usort($result["pData"], fn($a, $b) => $a["pricing"][0]["price"] <=> $b["pricing"][0]["price"]);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM