簡體   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