Ich mache eine Reihe von mathematischen Operationen in meiner Webanwendung und möchte Folgendes erhalten:

Bei einem Array von N Elementen, z. B. [1,2,3], drucken Sie auf dem Bildschirm ein anderes Array mit der gleichen Anzahl von Elementen, wobei jede Position die Multiplikation aller Elemente des Arrays mit Ausnahme der zu berechnenden Position ist.

Die Ergebnisbeispiele:

[1,2,3] muss drucken: [6,3,2]

[5,2,3,2,4] muss drucken: [48,120,80, 120, 60]

-1
Eduardo Quiñonez 19 Jän. 2019 im 07:12

3 Antworten

Beste Antwort

Keine speziellen Array-Manipulationen (Schneiden / Spleißen), nur supereinfache Mathematik.

Code: (Demo)

$array = [5,2,3,2,4];

foreach ($array as $val) {
    $result[] = array_product($array) / $val;
}

var_export($result);

Ausgabe:

array (
  0 => 48,
  1 => 120,
  2 => 80,
  3 => 120,
  4 => 60,
)

Sie können array_product($array) vor der Schleife zwischenspeichern, um die Effizienz zu erhöhen. Demo Dies ist praktisch die gleiche Logik wie Nicks Antwort. Ich finde es einfach einfacher, mit Sprachkonstrukten als mit funktionaler Programmierung zu lesen .

2
mickmackusa 19 Jän. 2019 im 05:34

Sie können array_product() verwenden, um das Produkt aller Werte in Ihrem Array abzurufen, und dann array_map() verwenden, um durch jeden angegebenen Wert zu dividieren, um diesen aus dem Gesamtprodukt zu "entfernen".

$arr =  [1, 2, 3];

$product = array_product($arr);
$res = array_map(function ($v) use ($product) {
  return $product == 0 ? 0 : $product/$v;
}, $arr);

print_r($res);

Ausgabe:

Array ( [0] => 6 [1] => 3 [2] => 2 )

Andere Fälle:

[5, 2, 3, 2, 4] gibt [48, 120, 80, 120, 60]

4
Nick Parsons 19 Juli 2019 im 11:59

Eine normale for-Schleife gibt Ihnen Zugriff auf den aktuellen Index. Innerhalb jeder Iteration der Schleife können Sie array_slice verwenden, um eine Kopie zu erstellen, und array_splice, um ein Element zu entfernen. Dann array_reduce mit einem geeigneten Rückruf, um die verbleibenden Werte zu multiplizieren.

function reduce_to_products_without_value_at_index( $initial_array ) {
  $num_elements = count( $initial_array );
  $product_array = [];

  for ( $index = 0; $index < $num_elements; $index++ ) {
    $array_copy = array_slice( $initial_array, 0 );
    array_splice( $array_copy, $index, 1 );
    $product = array_reduce( $array_copy, function( $carry, $item ) {
      return $carry * $item;
    }, 1 );
    $product_array[$index] = $product;
  }

  print_r( $product_array );
}

reduce_to_products_without_value_at_index( [1,2,3] );
reduce_to_products_without_value_at_index( [5,2,3,2,4] );
1
JasonB 19 Jän. 2019 im 04:36