2013-02-05 18 views
5

Ho un 2 array bidimensionale come questaphp - mappatura valori in una matrice bidimensionale 2 e funzioni eseguendo sui valori

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

I tasti column1 e column2 sono fissi. Non cambiano.

Ho bisogno di eseguire varie funzioni sui dati in questo array 2D. Le varie funzioni possono essere raggruppate in due modi:

  • Row-saggio prima
  • colonna-saggio prima

Un esempio per prime funzioni Row-saggio,

voglio riassumere prima tutti i numeri per riga prima di moltiplicare per colonne.

Così il comportamento previsto è (10 + 11) * (25 + 137) * (21 + 58)

Un esempio per prime funzioni colonna-saggio,

Voglio riassumere tutto il numeri in base alla colonna prima di moltiplicare per righe.

Così il comportamento previsto è (10 + 25 + 21) * (11 + 137 + 58)

Non ho problemi di scrittura le mie funzioni proprie dei componenti. In quanto sopra, ho bisogno solo di due funzioni componenti somma e prodotto

function sum (adden1, adden2) { 
    return adden1 + adden2; 
} 

function product (multiplicant1, multiplicant2) { 
    return multiplicant1 * multiplicant2; 
} 

Il problema è la mappatura. Voglio ridurre il numero di cicli iniziali che devo scrivere. Voglio che il mio codice per essere più modulare, perché ci sono situazioni in cui i comportamenti richiesti sono come:

  1. eseguire questo per ogni riga 100- (column1 + column2)/column2 e poi riassumere tutti i risultati.

Ci sono troppe formule che ho bisogno di lavorare. Ma sono molto fiducioso sul fatto che fondamentalmente sia tutto un misto di prima esecuzione per riga o prima per colonna.

Spero di ottenere alcuni suggerimenti sulla mappatura dei valori alle funzioni.

UPDATE:

Alla fine ho ridisegnare la mia architettura per rendere questo problema andare via. Quindi questa domanda non è più applicabile per me.

+0

Non credo, può essere fatto senza il ciclo 'for OR foreach'. –

+0

Puzzle in puzzle .. –

risposta

1

Row è saggio il più facile da mappare:

$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"; 

Colonna ha bisogno di saggio una funzione di utilità per afferrare tutte le colonne in un unico array:

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

Mi piace il tuo codice meglio di bmused. Ma mi piace che abbia messo i link a array_map e array_walk. Non sapevo che esistessero quelle funzioni. –

+0

@kimsia sì, il collegamento al manuale è conveniente :) basta digitare "php.net/" seguito da qualsiasi nome di funzione per ottenere lo stesso risultato. –

1

È necessario eseguire iterazioni sull'array in qualche modo. Dai un'occhiata a array_map e array_walk.

Ecco un esempio:

<?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

Grazie per avermi parlato di array_map e array_walk. Non sapevo che esistessero quelle funzioni. –

Problemi correlati