Spalte aus 2D-Array extrahieren

Spalte aus 2D-Array extrahieren

am 04.04.2008 20:37:35 von Thomas Mlynarczyk

Hallo,

Ich habe ein zweidimensionales Array - 1. Dimension sind Zeilen, 2.
Dimension Spalten, also $arr[$i][$j] wäre das Element in der $i-ten
Zeile und der $j-ten Spalte, wobei $i immer ein laufender Index
(0,1,2,...) ist und $j ein Spaltenname wie z.B. 'Id' oder 'Name'. Jetzt
will ich eine Spalte extrahieren und als 1D-Array zurückgeben, also
array( $arr[0][$j], $arr[1][$j], $arr[2][$j], ... ). Falls das Array nur
eine einzige Spalte besitzt, hätte ich folgende Lösung:

$a = array(
array( 'Id' => 10 ),
array( 'Id' => 11 ),
array( 'Id' => 12 ),
array( 'Id' => 13 ),
array( 'Id' => 14 ) );

print_r( array_map( 'current', $a ) );

Aber gibt es auch eine ebenso elegante Lösung, falls das Array mehrere
Spalten hat? Oder muß ich da wirklich for(each) bemühen?

Gruß,
Thomas

--
Ce n'est pas parce qu'ils sont nombreux à avoir tort qu'ils ont raison!
(Coluche)

Re: Spalte aus 2D-Array extrahieren

am 04.04.2008 21:11:22 von Johannes Mueller

Thomas Mlynarczyk wrote:
> Hallo,
>
> Ich habe ein zweidimensionales Array - 1. Dimension sind Zeilen, 2.
> Dimension Spalten, also $arr[$i][$j] wäre das Element in der $i-ten
> Zeile und der $j-ten Spalte, wobei $i immer ein laufender Index
> (0,1,2,...) ist und $j ein Spaltenname wie z.B. 'Id' oder 'Name'.
> Jetzt will ich eine Spalte extrahieren und als 1D-Array zurückgeben,
> also array( $arr[0][$j], $arr[1][$j], $arr[2][$j], ... ). Falls das
> Array nur eine einzige Spalte besitzt, hätte ich folgende Lösung:
>
> $a = array(
> array( 'Id' => 10 ),
> array( 'Id' => 11 ),
> array( 'Id' => 12 ),
> array( 'Id' => 13 ),
> array( 'Id' => 14 ) );
>
> print_r( array_map( 'current', $a ) );
>
> Aber gibt es auch eine ebenso elegante Lösung, falls das Array mehrere
> Spalten hat? Oder muß ich da wirklich for(each) bemühen?

z.Bsp. so:

$array = array(
array('id' => 1, 'name' => 'eins', 'foo' => 'bar'),
array('id' => 2, 'name' => 'zwei', 'foo' => 'bar'),
array('id' => 3, 'name' => 'drei', 'foo' => 'bar')
);

function getColumn($v){
return $v['id'];
}

print_r (
array_map('getColumn', $array)
);


Grüße
Johannes

--
Emails ohne "[nospam]" im Betreff werden kommentarlos gelöscht.

Re: Spalte aus 2D-Array extrahieren

am 04.04.2008 22:26:46 von Thomas Mlynarczyk

Johannes Mueller schrieb:

> z.Bsp. so:
>
> $array = array(
> array('id' => 1, 'name' => 'eins', 'foo' => 'bar'),
> array('id' => 2, 'name' => 'zwei', 'foo' => 'bar'),
> array('id' => 3, 'name' => 'drei', 'foo' => 'bar')
> );
>
> function getColumn($v){
> return $v['id'];
> }
>
> print_r (
> array_map('getColumn', $array)
> );

Das wäre eine Lösung, danke! Gibt es eigentlich keine PHP-Funktion
(außer der []-Syntax), die mir ein bestimmtes Element eines Arrays
liefert, also so etwas wie array_get_value( 'id', $arr )? Zumindest
intern müßte es doch sowas geben, oder?

Gruß,
Thomas

--
Ce n'est pas parce qu'ils sont nombreux à avoir tort qu'ils ont raison!
(Coluche)

Re: Spalte aus 2D-Array extrahieren

am 04.04.2008 23:00:53 von Markus Deckmann

Hi Thomas,

> Das wäre eine Lösung, danke! Gibt es eigentlich keine PHP-Funktion
> (außer der []-Syntax), die mir ein bestimmtes Element eines Arrays
> liefert, also so etwas wie array_get_value( 'id', $arr )? Zumindest
> intern müßte es doch sowas geben, oder?

Wie soll das denn funktionieren, zumindest mit deiner Syntax? ;-) Stell
dir vor du hast folgendes Array:

$list = array(
"Element1" => "Wert1",
"Element2" => "Wert2",
...
)

Bei diesem Beispiel funktioniert dein Beispiel mit
array_get_value('Element1', $list) noch. Schaut dein Array allerdings so
aus kann die Funktion ohne weitere oder erweiterte Parameter keine
Rückgabe liefern, außer wieder einem Array und dann wirds IMHO wieder
unelegant, da du zwar das Ergebnis wieder mit deiner Funktion abfragen
kannst, dafür allerdings dann wieder eine for-each-Konstruktion o.ä.
benötigst:

$list = array(
"Element1" => array(
"Name" => "Deckmann",
"Vorname" => "Markus"
),

"Element2" => array(
"Name" => "Mlynarczyk",
"Vorname" => "Thomas"
),

...
)

Wie sollte in dem eben dargestellten Beispiel deine Funktion ohne
weiteren Parameter direkt an den Namen oder Vornamen kommen? Sicher
könnte man hier der Funktion etwas in der Art von
array_get_value('Element1=>Name', $list) mitgeben und in der Funktion
diesen Weg "Element1=>Name" verfolgen und dann zurückgeben. Allerdings
würde ohne eine solche Erweiterung des Parameters die Rückgabe in diesem
Fall dann auch wieder ein Array darstellen, in etwa so:

array("Deckmann", "Mlynarczyk", ...) oder auch vielleicht so,

array(
"Element1" => "Deckmann",
"Element2" => "Mlynarczyk",
...
)

jenachdem wie die Funktion Ihre Rückgabe formuliert. Allerdings muss
diese zwingend eine Liste sein, zumindest wenn es sich um mehr als einen
Eintrag handelt den die Funktion zurückliefert. Bei Beispiel 2 ist
außerdem die Frage wie die Rückgabe aussieht wenn auch die Keys (in
unserem Beispiel "Name") ebenfalls wieder ein Array darstellen.

Du siehts, über so eine Funktion kann man sich viel den Kopf zerbrechen,
was rauskommt ist allerdings alles IMHO weniger elegant als der Zugriff
über foreach-Konstruktionen und der []-Syntax. Die Lesbarkeit des Codes
lasse ich dabei natürlich auch nicht außer Acht. Durch die []-Syntax und
einer durchdachten Benamung dieser Keys lässt sich der Code relativ
flüssig lesen und sofort sehen welche Werte an welcher Stelle ausgelesen
werden. Durch eine Funktion wäre das IMHO nicht mehr so gut sichtbar,
vor allem dann nicht wenn es sich um mehrdimensionale Arrays handelt und
der Zugriff über den oben skizzierten "erweiterten" Parameter stattfindet.

Ciao Markus

Re: Spalte aus 2D-Array extrahieren

am 04.04.2008 23:05:59 von Claus Reibenstein

Thomas Mlynarczyk schrieb:

> Gibt es eigentlich keine PHP-Funktion
> (außer der []-Syntax), die mir ein bestimmtes Element eines Arrays
> liefert, also so etwas wie array_get_value( 'id', $arr )?

function array_get_value($id, $arr) {
return $arr[$id];
}

Oder meintest Du etwas Anderes?

Gruß. Claus

Re: Spalte aus 2D-Array extrahieren

am 04.04.2008 23:26:24 von Markus Deckmann

Hi Claus,

> function array_get_value($id, $arr) {
> return $arr[$id];
> }
>
> Oder meintest Du etwas Anderes?

Mehrdimensionale Arrays ;-) lassen sich mit deiner Konstruktion leider
nicht abfragen, zumindest nicht wenn der Parameter $id nicht nur einen
Namen sondern vielleicht etwas in der Art xxx=>yyy besitzt um tiefer in
das Array "einzusteigen".

Ciao Markus

Re: Spalte aus 2D-Array extrahieren

am 05.04.2008 12:49:51 von Benjamin Zikarsky

Markus Deckmann schrieb:
>> function array_get_value($id, $arr) {
>> return $arr[$id];
>> }
>>


> Mehrdimensionale Arrays ;-) lassen sich mit deiner Konstruktion leider
> nicht abfragen, zumindest nicht wenn der Parameter $id nicht nur einen
> Namen sondern vielleicht etwas in der Art xxx=>yyy besitzt um tiefer in
> das Array "einzusteigen".

function array_get_value($id, $arr, $delim='=>') {
foreach (explode($delim, $id) as $path) {
if (false == isset($arr[$path])) {
throw new OutOfBoundsException("Unknown index $path");
}
$arr = $arr[$path];
}
return $arr;
}

So?


> Ciao Markus

Grüße
Benjamin

Re: Spalte aus 2D-Array extrahieren

am 05.04.2008 12:54:49 von Markus Deckmann

Hi Benjamin,

> function array_get_value($id, $arr, $delim='=>') {
> foreach (explode($delim, $id) as $path) {
> if (false == isset($arr[$path])) {
> throw new OutOfBoundsException("Unknown index $path");
> }
> $arr = $arr[$path];
> }
> return $arr;
> }
>
> So?

Ja, so würde es denk ich in etwa funktionieren, aber der Ursprungsposter
wollte auf das foreach-Konstrukt verzichten. Ansonsten würde es
natürlich so funktionieren, auch wenn der Trenner fest definiert wird,
dann spart man sich auch den weiteren Parameter. Aber es ist halt alles
IMHO nicht recht elegant im Gegensatz zur []-Syntax.

Ciao Markus

Re: Spalte aus 2D-Array extrahieren

am 05.04.2008 13:44:20 von Benjamin Zikarsky

Markus Deckmann schrieb:

>> function array_get_value($id, $arr, $delim='=>') {
>> foreach (explode($delim, $id) as $path) {
>> if (false == isset($arr[$path])) {
>> throw new OutOfBoundsException("Unknown index $path");
>> }
>> $arr = $arr[$path];
>> }
>> return $arr;
>> }


> Ja, so würde es denk ich in etwa funktionieren, aber der Ursprungsposter
> wollte auf das foreach-Konstrukt verzichten.

Die Frage ist wieso? Oder ging es vielleicht nur um die Verwendung einer
Schleife beim direkten Zugriff, immerhin wäre es ja jetzt in einer
Funktion/Methode gekapelt.
Eventuell liegt aber auch einfach ein falscher Ansatz zu dem
(ursprünglichen) Problem vor?


> Ansonsten würde es
> natürlich so funktionieren, auch wenn der Trenner fest definiert wird,
> dann spart man sich auch den weiteren Parameter.

Sehe ich nicht als Problem, wenn er auch einen Standardwert hat, oder
gibt es irgendwelche Gründe die Anzahl von Parametern zu reduzieren. Ich
glaube die dadurch gewonnene Felxibilität wiegt ein paar Byte
Speicherverbauch auf, oder? :)


Grüße
Benjamin

Re: Spalte aus 2D-Array extrahieren

am 05.04.2008 18:10:35 von Thomas Mlynarczyk

Claus Reibenstein schrieb:

> function array_get_value($id, $arr) {
> return $arr[$id];
> }
>
> Oder meintest Du etwas Anderes?

Genau so etwas meinte ich. Und ich hatte eben gehofft, daß PHP bereits
eine solche Funktion mitbringt (als alternative Syntax zur eckigen
Klammer). Dann bliebe nur noch das Problem, wie man array_map dazu
veranlassen kann, den zusätzlichen Parameter and das Callback
durchzureichen.

Gruß,
Thomas

--
Ce n'est pas parce qu'ils sont nombreux à avoir tort qu'ils ont raison!
(Coluche)

Re: Spalte aus 2D-Array extrahieren

am 05.04.2008 18:12:03 von Markus Deckmann

Hi Benjamin,

> Die Frage ist wieso? Oder ging es vielleicht nur um die Verwendung einer
> Schleife beim direkten Zugriff, immerhin wäre es ja jetzt in einer
> Funktion/Methode gekapelt.
> Eventuell liegt aber auch einfach ein falscher Ansatz zu dem
> (ursprünglichen) Problem vor?

Ich denke es sollte einfach geklärt werden ob es ein ähnlich elegantes
Konstrukt außer der []-Syntax und der foreach-Syntax gibt um beliebige
Elemente einer Liste auszulesen. Alles andere müsste der Ursprungsposter
klären.

Wenn es lediglich um die Schleife beim direkten Zugriff ging, stellt die
Kapselung des ganzen in eine Funktion natürlich die beste Möglichkeit
dar. Vor allem weil hier auch gleich eine Fehlerbehandlung implementiert
werden kann die abprüft ob überhaupt was vorhanden ist und nicht einfach
nur nichts zurückgibt.


> Sehe ich nicht als Problem, wenn er auch einen Standardwert hat, oder
> gibt es irgendwelche Gründe die Anzahl von Parametern zu reduzieren. Ich
> glaube die dadurch gewonnene Felxibilität wiegt ein paar Byte
> Speicherverbauch auf, oder? :)

Ich versuche bei meinen Lösungen immer mit möglichst wenig Daten zum
Erfolg zu kommen. Ich habe schon Leute gesehen die nach anderen
Kriterien gearbeitet haben und teilweise Methoden mit 20-30 Parametern
kreiert haben obwohl es bei diesen Dingen meist maximal die Hälfte auch
getan hätten.

Ciao Markus

Re: Spalte aus 2D-Array extrahieren

am 05.04.2008 18:32:06 von Thomas Mlynarczyk

Markus Deckmann schrieb:

>> Das wäre eine Lösung, danke! Gibt es eigentlich keine PHP-Funktion
>> (außer der []-Syntax), die mir ein bestimmtes Element eines Arrays
>> liefert, also so etwas wie array_get_value( 'id', $arr )? Zumindest
>> intern müßte es doch sowas geben, oder?
>
> Wie soll das denn funktionieren, zumindest mit deiner Syntax? ;-)

Ich verstehe jetzt das Problem nicht ganz:
array_get_value( $spalte, $quellarray ) <--> $quellarray[$spalte]

Das könnte ich dann in Johannes' Beispiel (statt getColumn) einbauen,
ohne selbst diese zusätzliche Funktion (getColumn bzw. array_get_value)
implementieren zu müssen. Einziges Problem wäre noch, array_map dazu zu
überreden, $spalte als zusätzlichen Parameter an das Callback
durchzureichen.

> Stell dir vor du hast folgendes Array:
>
> $list = array(
> "Element1" => "Wert1",
> "Element2" => "Wert2",
> ...
> )
>
> Bei diesem Beispiel funktioniert dein Beispiel mit
> array_get_value('Element1', $list) noch. Schaut dein Array allerdings so
> aus kann die Funktion ohne weitere oder erweiterte Parameter keine
> Rückgabe liefern, außer wieder einem Array und dann wirds IMHO wieder
> unelegant, da du zwar das Ergebnis wieder mit deiner Funktion abfragen
> kannst, dafür allerdings dann wieder eine for-each-Konstruktion o.ä.
> benötigst:
>
> $list = array(
> "Element1" => array(
> "Name" => "Deckmann",
> "Vorname" => "Markus"
> ),
>
> "Element2" => array(
> "Name" => "Mlynarczyk",
> "Vorname" => "Thomas"
> ),
>
> ...
> )
>
> Wie sollte in dem eben dargestellten Beispiel deine Funktion ohne
> weiteren Parameter direkt an den Namen oder Vornamen kommen?

Möglicherweise liegt hier ein Mißverständnis vor. Ich wollte - um Dein
Beispiel zu verwenden - aus obigem $list bei gegebenem Spaltennamen
('Name') folgendes erhalten:

array( 'Deckmann', 'Mlynarczyk' )

also ein Array, das aus den Werten einer bestimmten Spalte in der
zweiten Ebene besteht. Für den Spezialfall, daß es in der zweiten Ebene
nur eine einzige Spalte gibt ($list ohne die Vornamen, z.B.), hatte ich
bereits die Lösung

array_map( 'current', $list )

gefunden. Nun suche ich etwas, das genau so kurz und elegant ist, aber
auch bei mehreren Spalten in der zweiten Ebene funktioniert, also etwas
in der Art von

array_map( 'array_get_value', $list, 'Vorname' )

was funktionieren würde, wenn array_map den letzten Parameter an das
Callback durchreichen würde und die Funktion array_get_value als
PHP-Standardfunktion existieren würde.

> Sicher
> könnte man hier der Funktion etwas in der Art von
> array_get_value('Element1=>Name', $list) mitgeben und in der Funktion
> diesen Weg "Element1=>Name" verfolgen und dann zurückgeben. Allerdings
> würde ohne eine solche Erweiterung des Parameters die Rückgabe in diesem
> Fall dann auch wieder ein Array darstellen, in etwa so:

Die Rückgabewerte dürfen ja ihrerseits ruhig auch wieder Arrays sein.

Gruß,
Thomas

--
Ce n'est pas parce qu'ils sont nombreux à avoir tort qu'ils ont raison!
(Coluche)

Re: Spalte aus 2D-Array extrahieren

am 05.04.2008 18:36:33 von Thomas Mlynarczyk

Markus Deckmann schrieb:

>> function array_get_value($id, $arr) {
>> return $arr[$id];
>> }

> Mehrdimensionale Arrays ;-) lassen sich mit deiner Konstruktion leider
> nicht abfragen

Wenn array_get_value() als Callback verwendet wird, und vom
ursprünglichen Array nacheinander alle Zeilen plus den - immer gleichen
- Spaltennamen durchgereicht bekommt, tut es genau das, was es soll.

Gruß,
Thomas

--
Ce n'est pas parce qu'ils sont nombreux à avoir tort qu'ils ont raison!
(Coluche)

Re: Spalte aus 2D-Array extrahieren

am 05.04.2008 18:45:02 von Wolfgang Fellger

Thomas Mlynarczyk schrieb:

>Genau so etwas meinte ich. Und ich hatte eben gehofft, daß PHP bereits eine
>solche Funktion mitbringt

Kann es sein, dass dir etwas wie List Comprehension vorschwebt?
http://en.wikipedia.org/wiki/List_comprehension

Das gibt es in PHP in der Tat nicht.

--
Wolfgang Fellger

Re: Spalte aus 2D-Array extrahieren

am 05.04.2008 18:56:45 von Michael Fesser

..oO(Thomas Mlynarczyk)

>Claus Reibenstein schrieb:
>
>> function array_get_value($id, $arr) {
>> return $arr[$id];
>> }
>>
>> Oder meintest Du etwas Anderes?
>
>Genau so etwas meinte ich. Und ich hatte eben gehofft, daß PHP bereits
>eine solche Funktion mitbringt (als alternative Syntax zur eckigen
>Klammer). Dann bliebe nur noch das Problem, wie man array_map dazu
>veranlassen kann, den zusätzlichen Parameter and das Callback
>durchzureichen.

Bist Du fit in OOP? Dann könntest Du Deine Arraystruktur in einer Klasse
kapseln. Eine Public-Methode getColumn() kriegt den Namen der gewünsch-
ten Spalte per Parameter, schreibt ihn in eine Objektvariable und ruft
array_map() auf. Die zugehörige Callback-Methode holt sich dann den
Spaltennamen einfach aus der Objektvariablen.

Eine Nicht-OOP-Alternative wäre vielleicht, die Callback-Funktion
on-the-fly mittels create_function() zu erzeugen:

function getColumn($array, $key) {
return array_map(
create_function('$row', "return \$row['$key'];"),
$array
);
}

$data = array(
array('id' => 1, 'name' => 'eins', 'foo' => 'bar'),
array('id' => 2, 'name' => 'zwei', 'foo' => 'bar'),
array('id' => 3, 'name' => 'drei', 'foo' => 'bar')
);

var_dump(getColumn($data, 'id'));
var_dump(getColumn($data, 'name'));
var_dump(getColumn($data, 'foo'));
?>

Micha

Re: Spalte aus 2D-Array extrahieren

am 06.04.2008 00:35:15 von Thomas Mlynarczyk

Wolfgang Fellger schrieb:

> Kann es sein, dass dir etwas wie List Comprehension vorschwebt?
> http://en.wikipedia.org/wiki/List_comprehension

Nein, nein, nein - so was Kompliziertes will ich doch gar nicht. Ich
suche einfach nur eine elegante Möglichkeit, aus einem 2D-Array (welches
eine Tabelle oder Matrix repräsentiert) eine Spalte als 1D-Array
herauszuholen:

$arr = array(
// Spalte Foo Spalte Bar Spalte Baz
array( 'Foo' => 11, 'Bar' => 21, 'Baz' = 31 ), // Zeile 1
array( 'Foo' => 12, 'Bar' => 22, 'Baz' = 32 ), // Zeile 2
array( 'Foo' => 13, 'Bar' => 23, 'Baz' = 33 ) // Zeile 3
);

function getSpalte ( $arr, $spalte )
{
$spalten = array();
foreach ( $arr as $zeile )
{
$spalten[] = $zeile[$spalte];
}
return $spalten;
}

Und ich wollte nur wissen, ob es eine elegantere Implementierung von
getSpalte() gibt, z.B. etwas wie array_map( 'current', $arr ) - was mir
die erste Spalte liefert - auf eine beliebige Spalte verallgemeinert.

Gruß,
Thomas

--
Ce n'est pas parce qu'ils sont nombreux à avoir tort qu'ils ont raison!
(Coluche)

Re: Spalte aus 2D-Array extrahieren

am 06.04.2008 00:49:00 von Thomas Mlynarczyk

Michael Fesser schrieb:

> Bist Du fit in OOP? Dann könntest Du Deine Arraystruktur in einer Klasse
> kapseln. Eine Public-Methode getColumn() kriegt den Namen der gewünsch-
> ten Spalte per Parameter, schreibt ihn in eine Objektvariable und ruft
> array_map() auf. Die zugehörige Callback-Methode holt sich dann den
> Spaltennamen einfach aus der Objektvariablen.

Ja, das wäre eine Möglichkeit. Nur hatte ich eben gehofft, daß PHP von
Haus aus eine Funktion mitbringt, die sich direkt als Callback nutzen ließe.

> Eine Nicht-OOP-Alternative wäre vielleicht, die Callback-Funktion
> on-the-fly mittels create_function() zu erzeugen:
>
> > function getColumn($array, $key) {
> return array_map(
> create_function('$row', "return \$row['$key'];"),
> $array
> );
> }

Das wäre sicher eine elegante Lösung. Allerdings frage ich mich, ob die
Verwendung von create_function() nicht zu Performanceeinbußen führt - im
Vergleich zu einer Lösung mit Schleife.

Gerade ist mir noch folgende Möglichkeit eingefallen (ungetestet):

function getColumn ( $arr, $key = null )
{
static $_key = null;
if ( $key !== null ) { $_key = $key; }
return is_null( $key )
? $arr[$_key]
: array_map( 'getColumn', $arr );
}
?>

Allerdings scheint mir diese "Doppelrolle" von getColumn() irgendwie
nicht ganz "sauber"...

Gruß,
Thomas

--
Ce n'est pas parce qu'ils sont nombreux à avoir tort qu'ils ont raison!
(Coluche)

Re: Spalte aus 2D-Array extrahieren

am 06.04.2008 01:18:03 von Michael Fesser

..oO(Thomas Mlynarczyk)

>Michael Fesser schrieb:
>
>> Eine Nicht-OOP-Alternative wäre vielleicht, die Callback-Funktion
>> on-the-fly mittels create_function() zu erzeugen:
>>
>> >> function getColumn($array, $key) {
>> return array_map(
>> create_function('$row', "return \$row['$key'];"),
>> $array
>> );
>> }
>
>Das wäre sicher eine elegante Lösung. Allerdings frage ich mich, ob die
>Verwendung von create_function() nicht zu Performanceeinbußen führt - im
>Vergleich zu einer Lösung mit Schleife.

Das käme auf einen Test an. Da create_function() ja durchaus verwandt
ist mit eval(), dürfte ein Performanceunterschied feststellbar sein.
Andererseits ergeben sich dadurch bisweilen aber auch interessante
Möglichkeiten.

>Gerade ist mir noch folgende Möglichkeit eingefallen (ungetestet):
>
> >function getColumn ( $arr, $key = null )
>{
> static $_key = null;
> if ( $key !== null ) { $_key = $key; }
> return is_null( $key )
> ? $arr[$_key]
> : array_map( 'getColumn', $arr );
>}
>?>
>
>Allerdings scheint mir diese "Doppelrolle" von getColumn() irgendwie
>nicht ganz "sauber"...

Aber ist 'ne interessante Idee. Und wenn wir schon mal bei obskuren
Lösungen sind, hier noch eine, welche sich ein Feature von array_map()
zu Nutze macht, um der Callback-Funktion hinterrücks einen zusätzlichen
Parameter zu übergeben:

function getColumnData($row, $key) {
return $row[$key];
}

function getColumn($array, $key) {
return array_map(
'getColumnData',
$array,
array_fill(0, count($array), $key)
);
}
?>

Aber sowas will man eigentlich nicht einsetzen. Dann lieber Schleifen.

Micha

Re: Spalte aus 2D-Array extrahieren

am 06.04.2008 18:44:22 von Thomas Mlynarczyk

Michael Fesser schrieb:

> Aber ist 'ne interessante Idee. Und wenn wir schon mal bei obskuren
> Lösungen sind, hier noch eine, welche sich ein Feature von array_map()
> zu Nutze macht, um der Callback-Funktion hinterrücks einen zusätzlichen
> Parameter zu übergeben:
>
> > function getColumnData($row, $key) {
> return $row[$key];
> }
>
> function getColumn($array, $key) {
> return array_map(
> 'getColumnData',
> $array,
> array_fill(0, count($array), $key)
> );
> }
> ?>

Genial! Ich hatte ganz vergessen, daß array_map() auch mehrere Arrays
akzeptiert... Wenn man jetzt noch irgendwie vermeiden könnte, die
Funktion getColumnData() definieren zu müssen...

> Aber sowas will man eigentlich nicht einsetzen. Dann lieber Schleifen.

Na ja, wenn ich PHP intern die Schleife machen lassen kann, dürfte
wahrscheinlich einiges an Overhead wegfallen und alles etwas schneller
gehen, als wenn ich selbst zu for(each) greife. Andererseits hast Du
natürlich recht - je einfacher und direkter, umso besser. Ich werde also
wahrscheinlich doch brav iterieren.

Gruß,
Thomas

--
Ce n'est pas parce qu'ils sont nombreux à avoir tort qu'ils ont raison!
(Coluche)

Re: Spalte aus 2D-Array extrahieren

am 06.04.2008 20:08:49 von Michael Fesser

..oO(Thomas Mlynarczyk)

>Michael Fesser schrieb:
>
>> Aber ist 'ne interessante Idee. Und wenn wir schon mal bei obskuren
>> Lösungen sind, hier noch eine, welche sich ein Feature von array_map()
>> zu Nutze macht, um der Callback-Funktion hinterrücks einen zusätzlichen
>> Parameter zu übergeben:
>>
>> >> function getColumnData($row, $key) {
>> return $row[$key];
>> }
>>
>> function getColumn($array, $key) {
>> return array_map(
>> 'getColumnData',
>> $array,
>> array_fill(0, count($array), $key)
>> );
>> }
>> ?>
>
>Genial! Ich hatte ganz vergessen, daß array_map() auch mehrere Arrays
>akzeptiert... Wenn man jetzt noch irgendwie vermeiden könnte, die
>Funktion getColumnData() definieren zu müssen...

Das sehe ich nicht als Problem. PHP kann von Hause aus nicht alles
leisten, was man gerne hätte. Was fehlt, wird dann halt einfach selber
nachgerüstet. Und gerade so eine billige Funktion wie oben bzw. das im
Thread angesprochene array_get_value() ist doch schnell der eigenen
Werkzeugsammlung hinzugefügt. Wenn Du Pech/Glück hast (wie man's sieht),
kommt sogar in einer der nächsten Versionen eine gleichnamige Funktion
und macht genau das, was Du willst (hab ich schon erlebt) ...

>> Aber sowas will man eigentlich nicht einsetzen. Dann lieber Schleifen.
>
>Na ja, wenn ich PHP intern die Schleife machen lassen kann, dürfte
>wahrscheinlich einiges an Overhead wegfallen und alles etwas schneller
>gehen, als wenn ich selbst zu for(each) greife. Andererseits hast Du
>natürlich recht - je einfacher und direkter, umso besser. Ich werde also
>wahrscheinlich doch brav iterieren.

Es kommt immer auf einen Test an. Was PHP intern macht und wie es
optimiert, ist für Außenstehende praktisch nicht zu durchschauen. Man
muß oftmals auch abwägen zwischen Lesbarkeit des Codes und Performance.

Micha

Re: Spalte aus 2D-Array extrahieren

am 06.04.2008 23:13:10 von Thomas Mlynarczyk

Michael Fesser schrieb:

>> Wenn man jetzt noch irgendwie vermeiden könnte, die
>> Funktion getColumnData() definieren zu müssen...

> Das sehe ich nicht als Problem. PHP kann von Hause aus nicht alles
> leisten, was man gerne hätte. Was fehlt, wird dann halt einfach selber
> nachgerüstet. Und gerade so eine billige Funktion wie oben bzw. das im
> Thread angesprochene array_get_value() ist doch schnell der eigenen
> Werkzeugsammlung hinzugefügt.

Schon, aber wenn diese Funktion nur an einer einzigen Stelle meines
Scripts zum Einsatz kommen soll - als lokale Hilfsunterfunktion...

> Es kommt immer auf einen Test an. Was PHP intern macht und wie es
> optimiert, ist für Außenstehende praktisch nicht zu durchschauen. Man
> muß oftmals auch abwägen zwischen Lesbarkeit des Codes und Performance.

Ja, da hast Du natürlich recht. Aber ich denke doch, daß das "Nachbauen"
von Funktionalität, die PHP bereits intern mitbringt, die Performance
nur verschlechtern kann. Immerhin - PHP ist in C(++?) geschrieben, mein
Script dagegen "nur" in PHP. Deshalb denke ich, daß es grundsätzlich
besser ist, PHP so viel wie möglich "selbst" (intern) erledigen zu
lassen. Die Lesbarkeit des Codes muß dadurch ja nicht zwangsweise
ungebührlich leiden. Aber das kommt natürlich auf den Einzelfall an. Für
das in diesem Thread diskutierte Problem wäre die Schleifenvariante
wahrscheinlich doch geeigneter. Und falls sich doch Performanceprobleme
ergeben sollten, kann ich immer noch den Code innerhalb der Funktion ändern.

Gruß,
Thomas


--
Ce n'est pas parce qu'ils sont nombreux à avoir tort qu'ils ont raison!
(Coluche)

Re: Spalte aus 2D-Array extrahieren

am 07.04.2008 02:17:27 von Markus Deckmann

Hi Thomas,

> Schon, aber wenn diese Funktion nur an einer einzigen Stelle meines
> Scripts zum Einsatz kommen soll - als lokale Hilfsunterfunktion...

Da wären wir IMHO wieder auf der abstrakten Ebene der Programmierung.
Die von dir beschriebene Funktion ist so abstrakt formuliert bis jetzt
das sie auch in zukünftigen Projekten zum Einsatz kommen kann wenn sie
denn einmal geschrieben ist. Solche Funktionen also der eigenen
Werkzeugsammlung hinzuzufügen halte ich für durchaus sinnvoll. Zumindest
dann wenn die Funktion eine Arbeit verrichtet die nicht zu spezifisch
ist so das ich sie wirklich nur ein einziges Mal verwenden kann und für
jede weitere Verwendung eh wieder anpassen müsste.

Ciao Markus