Porównanie zawartości tablicy i wyliczenie różnicy

0

Witajcie,

Potrzebuję pomocy w przerobieniu tablicy tzn. chciałbym porównać każdy element i wyliczyć różnicę tzn:

Dane wejściowe:

array (size=2)
  0 => 
    array (size=4)
      'symbol' => string 'ciężarówki' (length=7)
      'star' => float 5
      'mercedes' => float 5.5 
      'kamaz' => float 6
  1 => 
    array (size=4)
      'symbol' => string 'osobowe' (length=7)
      'seat' => float 1.2
      'fiat' => float 1.1
      'peugeot' => 1.5

Dane wyjściowe jakie powinny być:

array (size=2)
  0 => 
    array (size=4)
      'symbol' => string 'ciężarówki' (length=7)
      array (size=2)
           'star' => float 5
           'mercedes' => float 5.5 
           'diff' => float -0.5
      array (size=2)
           'star' => float 5
           'kamaz' => float 6
           'diff' => float -1
      array (size=2)
           'mercedes' => float 5.5
           'kamaz' => float 6
           'diff' => float --0.5
      array (size=2)
           'mercedes' => float 5.5
           'star' => float 5
           'diff' => float 0.5
      array (size=2)
           'kamaz' => float 6
           'star' => float 5
           'diff' => float 1
      array (size=2)
           'kamaz' => float 6
           'mercedes' => float 5.5
           'diff' => float 0.5

itd..

0

Możesz bazować na tym kodzie

<?php //php 7.0.8
//https://gist.github.com/jwage/11193216
class Cartesian
{
    public static function build($set)
    {
        if (!$set) {
            return array(array());
        }
        $subset = array_shift($set);
        $cartesianSubset = self::build($set);
        $result = array();
        foreach ($subset as $value) {
            foreach ($cartesianSubset as $p) {
                array_unshift($p, $value);
                $result[] = $p;
            }
        }
        return $result;        
    }
}

$a = array(
    array(
        "symbol" => "ciężarówki",
        'star' => 5.0,
        'mercedes' => 5.5,
        'kamaz' => 6.0
    ),
    array(
        "symbol" => "osobowe",
        'seat' => 1.2,
        'fiat' => 1.1,
        'peugeot' => 1.5
    )
);

function f($v) { 
    $c = Cartesian::build(array(array_keys($v), array_keys($v)));
    $c = array_filter($c, function($i) {
        return $i[0] != "symbol" && $i[1] != "symbol" && $i[0] != $i[1];
    });
    
    $a = array_map(function($item) use ($v) {
        return array(
            $item[0] => $v[$item[0]],
            $item[1] => $v[$item[1]],
            "diff" => $v[$item[0]] - $v[$item[1]]
        );
    }, $c);
    
    return array(
        "symbol" => $v["symbol"],
        $a        
    );
};
$a = array_map("f", $a);
var_dump($a);
?>

1 użytkowników online, w tym zalogowanych: 0, gości: 1