Usando el proveedor con mayor margen usando lógica PHP

Tengo los siguientes valores de una llamada a la base de datos a la que quiero aplicar algo de lógica. Pensé que originalmente podría usar PHP max sin embargo, este no parece ser el caso.

Tengo tres proveedores de un producto. Sin embargo, es posible que no todos tengan en stock el artículo que estoy mostrando, y todos ofrecen un margen diferente, producto por producto, por eso no puedo decir que, en general, el proveedor 1 es mejor que el proveedor 2, etc.

$supplier1Live = 1
$supplier2Live = 1
$supplier3Live = 0

$marginSupplier1 = 20
$marginSupplier2 = 40
$martinSupplier3 = 50

En este ejemplo, me gustaría usar el Proveedor 2 ya que almacenan el producto supplier2Live = 1 y también tienen el mejor margen que el otro proveedor que almacena el producto (proveedor1)

Sin embargo, mi mente se está quedando en blanco sobre cómo codificar esto.

Pensé que podría agregarlo a una matriz dando:

$array = array(
    "supplier1" => array(
         "live" => 1,
         "margin" => 20
     ),
     "supplier2" => array(
         "live" => 1,
         "margin" => 40
     ),
     "supplier3" => array(
         "live" => 0,
         "margin" => 50
     )
);

Y ejecutar algo sobre eso, pero no estoy seguro de qué hacer.

preguntado el 09 de marzo de 12 a las 15:03

4 Respuestas

Filtrar la matriz usando matriz_filtro (filtrar por live == 1), y luego encontrar el máximo de la matriz resultante (máximo en el valor de "margen")

Así, si entiendo correctamente

$array = array(
    "supplier1" => array(
        "live" => 1,
        "margin" => 20
    ),
    "supplier2" => array(
        "live" => 1,
        "margin" => 40
    ),
    "supplier3" => array(
        "live" => 0,
        "margin" => 50
    )
);
$res = array_filter($array,function($v){return $v["live"];});
$supplier = array_reduce($res, function($a, $b){
       return $a["margin"]>$b["margin"]?$a:$b;
});
print_r($supplier);

respondido 09 mar '12, 15:03

Intente algo como esto:

$best_supplier = null;
$best_supplier_margin = null;
foreach($array as $name => $supplier) {
    if($supplier['live']) {
        if($supplier['margin'] > $best_supplier_margin || is_null($best_supplier_margin)) {
            $best_supplier = $name;
            $best_supplier_margin = $supplier['margin'];
        }
    }
}

if(is_null($best_supplier)) throw new Exception('No suppliers are live!');

echo $best_supplier;

respondido 09 mar '12, 15:03

Entonces, básicamente, quieres encontrar el max of supplierXLive * marginSupplierX?

respondido 09 mar '12, 15:03

No, quiero encontrar el nombre (proveedorx) del que tiene el mayor margen pero que también tiene live = 1 - bateman_ap

También puede implementar una función de comparación personalizada y proporcionarla a PHP usort () función

respondido 09 mar '12, 15:03

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.