2013-02-05 2 views
5

I haben eine 2-dimensionale Array wie folgtphp - Werte in einem 2-dimensionalen Array Kartierung und Funktionen auf den Werten

array(
    array(
     'column1' => 10, 
     'column2' => 11 
    ), 
    array(
     'column1' => 25, 
     'column2' => 137 
    ), 
    array(
     'column1' => 21, 
     'column2' => 58 
    ) 
) 

Die Tasten und column1column2 fixiert Durchführung sind. Sie ändern sich nicht.

Ich muss verschiedene Funktionen für die Daten in diesem 2D-Array durchführen. Die verschiedenen Funktionen können auf zwei Arten eingeteilt werden:

  • Zeilenweiser ersten
  • Column-weise erste

Ein Beispiel für Zeilenweiser ersten Funktionen,

ich summieren möchten alle Zahlen zuerst zeilenweise auf, bevor sie mit Spalten multipliziert werden.

So das erwartete Verhalten ist (10 + 11) * (25 + 137) * (21 + 58)

Ein Beispiel für Column-weise erste Funktionen,

Ich mag alles zusammenzufassen die Zahlen zuerst spaltenweise, bevor sie mit Zeilen multipliziert werden.

So das erwartete Verhalten ist (10 + 25 + 21) * (11 + 137 + 58)

Ich habe keine Probleme meine eigene Komponentenfunktionen auszuschreiben. In dem oben genannten, brauche ich nur zwei Komponentenfunktionen Summe und Produkt

Das Problem ist die Zuordnung. Ich möchte die Anzahl der for-Schleifen reduzieren, die ich schreiben muss. Ich möchte meinen Code modularer sein, denn es gibt Situationen, in denen die erforderlichen Verhaltensweisen wie:

  1. dies für jede Zeile durchführen 100- (column1 + column2)/column2 und dann alle Ergebnisse zusammenfassen.

Es gibt zu viele Formeln, die ich arbeiten muss. Aber ich bin sehr zuversichtlich, dass es im Grunde alles eine Mischung ist, die entweder zuerst die Reihe oder zuerst spaltenweise ausführt.

Ich hoffe, einige Vorschläge für die Zuordnung der Werte zu den Funktionen zu bekommen.

UPDATE:

Schließlich Neugestaltung ich meine Architektur dieses Problem weg gehen. Diese Frage trifft also nicht mehr auf mich zu.

+0

Ich glaube nicht, es kann ohne 'for OR foreach'-Schleife gemacht werden. –

+0

Puzzle in Puzzle .. –

Antwort

1

Row weise ist die am einfachsten zu Karte:

$a = array(
    array(
     'column1' => 10, 
     'column2' => 11 
    ), 
    array(
     'column1' => 25, 
     'column2' => 137 
    ), 
    array(
     'column1' => 21, 
     'column2' => 58 
    ) 
); 

echo array_product(array_map('array_sum', $a)), "\n"; 

Säule weise braucht eine Nutzenfunktion alle Spalten zusammen in einem Array zu greifen:

echo array_product(array(
    array_sum(array_column($a, 'column1')), 
    array_sum(array_column($a, 'column2')) 
)), PHP_EOL; 

function array_column(array $a, $column) 
{ 
    return array_map(function($item) use ($column) { 
    return $item[$column]; 
    }, $a); 
} 
+0

Ich mag deinen Code besser als bmused. Aber ich mag, dass die Links zu array_map und array_walk bmused setzen. Ich wusste nicht, dass diese Funktionen existieren. –

+0

@kimsia ja, die Verknüpfung mit dem Handbuch ist bequem :) Geben Sie einfach "php.net/" gefolgt von einem Funktionsnamen, um das gleiche zu erreichen. –

1

Sie müssen irgendwie über das Array iterieren. Werfen Sie einen Blick auf array_map und array_walk.

Hier ist ein Beispiel:

<?php 
$input = array(
    array(
     'column1' => 10, 
     'column2' => 11 
    ), 
    array(
     'column1' => 25, 
     'column2' => 137 
    ), 
    array(
     'column1' => 21, 
     'column2' => 58 
    ) 
); 

echo 'Row wise : ', array_product(array_map(
    function($row){ 
    return $row['column1'] + $row['column2']; 
    }, $input)), '<br/>'; 

$output = array(0,0); 
array_walk($input, 
    function($val, $key, &$output){ 
    $output[0] += $val['column1']; 
    $output[1] += $val['column2']; 
    }, &$output); 
echo 'Column wise : ', array_product($output); 


?> 
+0

Danke, dass Sie mir von array_map und array_walk erzählen. Ich wusste nicht, dass diese Funktionen existieren. –

Verwandte Themen