0
votes

Trier le tableau multidimensionnel par valeur et ne pas l'inclure dans le tri si la valeur de priorité est 0

Je dois trier ci-dessous le tableau donné par priorité. Si la valeur de priorité est 0, ne pas inclure dans le tableau de tri. J'ai essayé de nombreuses façons, mais je n'ai pas obtenu la sortie comme prévu.

Array
(
[recently_viewed] => Array
    (
        [priority] => 1
        [no_of_products] => 1
    )

[recently_visited_cat] => Array
    (
        [priority] => 1
        [no_of_products] => 1
    )

[last_ordered_items] => Array
    (
        [priority] => 3
        [no_of_products] => 3
    )

[searched_based] => Array
    (
        [priority] => 0
        [no_of_products] => 4
    )

[cart_based] => Array
    (
        [priority] => 1
        [no_of_products] => 5
    )

[wishlist_based] => Array
    (
        [priority] => 1
        [no_of_products] => 6
    )

[sku_based] => Array
    (
        [priority] => 0
        [no_of_products] => 7
    )
)

S'il vous plaît, aidez-moi.


3 Réponses :


1
votes

Vous pouvez utiliser array_filter () fonction pour exclure les enregistrements avec 0 priorité. Après cela, vous pouvez trier le tableau avec l'aide uasort () code > fonction. Par exemple:

$arr = array_filter($arr, function($element) {
    return $element['priority'] > 0;
});

uasort($arr, function ($a, $b) {
    if ($a['priority'] === $b['priority']) {
        return 0;
    }
    return ($a['priority'] < $b['priority']) ? -1 : 1;
});


3 commentaires

Votre code de rappel uasort peut simplement être return $ a ['priority'] <=> $ b ['priority'] ou return $ a ['priority' ] - $ b ['priority'] (avant PHP7). Notez que cela dépend également si une priorité plus élevée a une valeur de priorité plus élevée ou plus basse (sinon changez simplement les opérandes).


@Jeto bien sûr, mais je ne sais pas quelle version de PHP utilise l'auteur, donc je n'utilise pas l'opérateur <=>


Bien - l'autre alternative (avec - ) fonctionne sur n'importe quelle version cependant.



1
votes

Vous pouvez utiliser array_filter ( doc - pour vérifier plus grand que 0) puis uasort ( doc ):

$arr = [];
$arr["recently_viewed"] = ["priority" => 1, "no_of_products" =>1];
$arr["searched_based"] = ["priority" => 0, "no_of_products" =>4];
$arr["last_ordered_items"] = ["priority" => 3, "no_of_products" =>3];

$arr = array_filter($arr, function ($e) {return $e["priority"];});
uasort($arr, function($a, $b) {
    return $a['priority'] - $b['priority'];
});

Exemple en direct: 3v4l a>


2 commentaires

Si la priorité est 1, elle doit être en premier dans le tableau.


@Magecode - Je fais l'ordre de descente - met à jour l'ordre des $ a et $ b - maintenant c'est asc



0
votes

Vous pouvez utiliser array_filter avec la fonction callback pour supprimer les valeurs avec ZERO

usort($arr, function($a, $b)  {
    return $a['priority'] <=> $b['priority'];
});

Cela va supprimez tout le sous-tableau qui a des valeurs de priorité ZERO.

Vous pouvez maintenant appliquer usort pour trier le tableau

$arr = array_filter($arr, function ($e) {return $e["priority"];});

Voir le code de travail Live


1 commentaires

Remarquez d'abord les clés du tableau - OP voudra probablement les conserver - utilisez donc uasort et non usort . Deuxièmement - qu'est-ce qui est différent ici, puis une autre réponse?