By using this site, you agree to our updated Privacy Policy and our Terms of Use. Manage your Cookies Settings.
455,746 Members | 1,780 Online
Bytes IT Community
+ Ask a Question
Need help? Post your question and get tips & solutions from a community of 455,746 IT Pros & Developers. It's quick & easy.

create array from members of an array of objects

P: n/a
Hello,
I have the following situation:

$list[] is an array of MyElement objects.

MyElement has two members: MyElement->member1; MyElement->member2;

What I want is to get the following:

$newlist[] so that:

$newlist[0]=$list[0]->member2;
$newlist[1]=$list[1]->member2;
$newlist[2]=$list[2]->member2;
....

I need to do this using A SINGLE LINE OF CODE.
Is it possible? How to do this?

I tried with:

array_walk($list,create_function('$a,$b,$result',' $result[] =
$a->member2;'), &$result);

but I get the following error:

Warning: Call-time pass-by-reference has been deprecated - argument
passed by value; If you would like to pass it by reference, modify the
declaration of array_walk(). If you would like to enable call-time
pass-by-reference, you can set allow_call_time_pass_reference to true in
your INI file. However, future versions may not support this any longer.

Thank you
Regards
Feb 7 '07 #1
Share this Question
Share on Google+
10 Replies


P: n/a
Rik
Generale Cluster <al**@carrarosoftmasters.netwrote:
Hello,
I have the following situation:

$list[] is an array of MyElement objects.

MyElement has two members: MyElement->member1; MyElement->member2;

What I want is to get the following:

$newlist[] so that:

$newlist[0]=$list[0]->member2;
$newlist[1]=$list[1]->member2;
$newlist[2]=$list[2]->member2;
...

I need to do this using A SINGLE LINE OF CODE.
Is it possible? How to do this?
Nothing _needs_ to be done in a single line of code, and for some actions
you shouldn't even want it for readability.
I tried with:

array_walk($list,create_function('$a,$b,$result',' $result[] =
$a->member2;'), &$result);
Tssk, single line, but a create_function()... That's cheating :P

$newlist = array_map(create_function('$v','return $v->member2'),$list);

--
Rik Wasmus
Feb 7 '07 #2

P: n/a
Generale Cluster wrote:
Hello,
I have the following situation:

$list[] is an array of MyElement objects.

MyElement has two members: MyElement->member1; MyElement->member2;

What I want is to get the following:

$newlist[] so that:

$newlist[0]=$list[0]->member2;
$newlist[1]=$list[1]->member2;
$newlist[2]=$list[2]->member2;
...

I need to do this using A SINGLE LINE OF CODE.
Is it possible? How to do this?

I tried with:

array_walk($list,create_function('$a,$b,$result',' $result[] =
$a->member2;'), &$result);

but I get the following error:

Warning: Call-time pass-by-reference has been deprecated - argument
passed by value; If you would like to pass it by reference, modify the
declaration of array_walk(). If you would like to enable call-time
pass-by-reference, you can set allow_call_time_pass_reference to true in
your INI file. However, future versions may not support this any longer.

Thank you
Regards

Try:

array_walk($list,create_function('$a,$b,&$result', '$result[] =
$a->member2;'), $result);

Specify the reference in the parameter list, not when passing the value.
--
==================
Remove the "x" from my email address
Jerry Stuckle
JDS Computer Training Corp.
js*******@attglobal.net
==================
Feb 7 '07 #3

P: n/a
Rik wrote:
Generale Cluster <al**@carrarosoftmasters.netwrote:
>Hello,
I have the following situation:

$list[] is an array of MyElement objects.

MyElement has two members: MyElement->member1; MyElement->member2;

What I want is to get the following:

$newlist[] so that:

$newlist[0]=$list[0]->member2;
$newlist[1]=$list[1]->member2;
$newlist[2]=$list[2]->member2;
...

I need to do this using A SINGLE LINE OF CODE.
Is it possible? How to do this?

Nothing _needs_ to be done in a single line of code, and for some
actions you shouldn't even want it for readability.
>I tried with:

array_walk($list,create_function('$a,$b,$result', '$result[] =
$a->member2;'), &$result);

Tssk, single line, but a create_function()... That's cheating :P

$newlist = array_map(create_function('$v','return $v->member2'),$list);

--Rik Wasmus
Rik,

Sounds like a homework assignment to me... :-)
--
==================
Remove the "x" from my email address
Jerry Stuckle
JDS Computer Training Corp.
js*******@attglobal.net
==================
Feb 7 '07 #4

P: n/a
"Generale Cluster" <al**@carrarosoftmasters.netwrote in message
news:eq**********@newsreader.mailgate.org...
Hello,
I have the following situation:

$list[] is an array of MyElement objects.

MyElement has two members: MyElement->member1; MyElement->member2;

What I want is to get the following:

$newlist[] so that:

$newlist[0]=$list[0]->member2;
$newlist[1]=$list[1]->member2;
$newlist[2]=$list[2]->member2;
...

I need to do this using A SINGLE LINE OF CODE.
foreach($list as $foo) $newlist[] = $foo->member2;
I tried with:

array_walk($list,create_function('$a,$b,$result',' $result[] =
$a->member2;'), &$result);
"Gloves".
http://thedailywtf.com/Articles/The_Complicator's_Gloves.aspx

--
"Ohjelmoija on organismi joka muuttaa kofeiinia koodiksi" - lpk
http://outolempi.net/ahdistus/ - Satunnaisesti päivittyvä nettisarjis
sp**@outolempi.net | rot13(xv***@bhgbyrzcv.arg)
Feb 8 '07 #5

P: n/a
Jerry Stuckle ha scritto:
Rik wrote:
>Generale Cluster <al**@carrarosoftmasters.netwrote:
>>Hello,
I have the following situation:

$list[] is an array of MyElement objects.

MyElement has two members: MyElement->member1; MyElement->member2;

What I want is to get the following:

$newlist[] so that:

$newlist[0]=$list[0]->member2;
$newlist[1]=$list[1]->member2;
$newlist[2]=$list[2]->member2;
...

I need to do this using A SINGLE LINE OF CODE.
Is it possible? How to do this?

Nothing _needs_ to be done in a single line of code, and for some
actions you shouldn't even want it for readability.
>>I tried with:

array_walk($list,create_function('$a,$b,$result' ,'$result[] =
$a->member2;'), &$result);

Tssk, single line, but a create_function()... That's cheating :P

$newlist = array_map(create_function('$v','return $v->member2'),$list);

--Rik Wasmus

Rik,

Sounds like a homework assignment to me... :-)

Hi, thanks to Rik for the answer; it's exactly what I intended.
It's not a homework assignment, I simply want to write code which is
easy to integrate with HTML. I'm working together with another person
who is not a programmer: he's an HTML author and I need to make the code
structure as essential as possible. I've coded my own generic tag
library which generates html code from data and in this particular case
I have a function which build a "select multiple" HTML tag.
So, in my html page I have the following line:

<?php
fillHTMLSelectMultiple($aValues,"author[]","",array_map(create_function('$a','return
$a->author_id;'),$resource->aAuthors),'size="5"')?>

- $aValues is an array containing the key-value couples to be displayed
in the select.
- "author[]" is the name and id of the HTML tag
- array_map(...) contains an array the keys which have to appear
preselected in the select control.
- $resource is an object which is loaded by a self-made CRUD handler and
contains a member variable which is an array of "MyElement" objects
(where member2 is the authorId).

This way, my friend, who does not know php, is able to move the select
anywhere on the page by simply moving the php code line, and I do not
risk to have my code corrupted by a mistake by my friend.
I know I could build my array of selected values previously in my code,
but I got the question in my mind and I physiologically NEEDED to have
an answer :-)

I don't know if this may be called "extreme programming" ?
I'd rather call it "academic fury" :-D

bye!




Feb 9 '07 #6

P: n/a
Generale Cluster wrote:
Jerry Stuckle ha scritto:
>Rik wrote:
>>Generale Cluster <al**@carrarosoftmasters.netwrote:

Hello,
I have the following situation:

$list[] is an array of MyElement objects.

MyElement has two members: MyElement->member1; MyElement->member2;

What I want is to get the following:

$newlist[] so that:

$newlist[0]=$list[0]->member2;
$newlist[1]=$list[1]->member2;
$newlist[2]=$list[2]->member2;
...

I need to do this using A SINGLE LINE OF CODE.
Is it possible? How to do this?

Nothing _needs_ to be done in a single line of code, and for some
actions you shouldn't even want it for readability.

I tried with:

array_walk($list,create_function('$a,$b,$result ','$result[] =
$a->member2;'), &$result);

Tssk, single line, but a create_function()... That's cheating :P

$newlist = array_map(create_function('$v','return $v->member2'),$list);

--Rik Wasmus

Rik,

Sounds like a homework assignment to me... :-)


Hi, thanks to Rik for the answer; it's exactly what I intended.
It's not a homework assignment, I simply want to write code which is
easy to integrate with HTML. I'm working together with another person
who is not a programmer: he's an HTML author and I need to make the code
structure as essential as possible. I've coded my own generic tag
library which generates html code from data and in this particular case
I have a function which build a "select multiple" HTML tag.
So, in my html page I have the following line:

<?php
fillHTMLSelectMultiple($aValues,"author[]","",array_map(create_function('$a','return
$a->author_id;'),$resource->aAuthors),'size="5"')?>

- $aValues is an array containing the key-value couples to be displayed
in the select.
- "author[]" is the name and id of the HTML tag
- array_map(...) contains an array the keys which have to appear
preselected in the select control.
- $resource is an object which is loaded by a self-made CRUD handler and
contains a member variable which is an array of "MyElement" objects
(where member2 is the authorId).

This way, my friend, who does not know php, is able to move the select
anywhere on the page by simply moving the php code line, and I do not
risk to have my code corrupted by a mistake by my friend.
I know I could build my array of selected values previously in my code,
but I got the question in my mind and I physiologically NEEDED to have
an answer :-)

I don't know if this may be called "extreme programming" ?
I'd rather call it "academic fury" :-D

bye!

That's the difference. I prefer code which is easily understandable.

You had trouble getting it to work in the first place. What happens
when you have to look at it six months or a year from now when you have
to work on it again? You'll go through all of his again to understand
what it does.

If you want it to be a single line, make it a function call. But even
if it's multiple lines he should be able to copy and paste.

I have a similar setup for one of my customers. They maintain the
content, I maintain the (interspaced) code. They even build entirely
new pages by copying/pasting sections of html and code from other pages.

Sure, once in a while they have a problem - but not often. But they're
saving a bunch of money over having to pay me to make the frequent
content changes.

--
==================
Remove the "x" from my email address
Jerry Stuckle
JDS Computer Training Corp.
js*******@attglobal.net
==================
Feb 9 '07 #7

P: n/a
Jerry Stuckle ha scritto:
Generale Cluster wrote:
>Jerry Stuckle ha scritto:
>>Rik wrote:
Generale Cluster <al**@carrarosoftmasters.netwrote:
[CUT]
>
That's the difference. I prefer code which is easily understandable.

You had trouble getting it to work in the first place. What happens
when you have to look at it six months or a year from now when you have
to work on it again? You'll go through all of his again to understand
what it does.
[CUT]

comment, comment, comment and comment again :-)

bye!





Feb 14 '07 #8

P: n/a
Rik
On Wed, 14 Feb 2007 02:12:32 +0100, Generale Cluster
<al**@carrarosoftmasters.netwrote:
Jerry Stuckle ha scritto:
>Generale Cluster wrote:
>>Jerry Stuckle ha scritto:
Rik wrote:
Generale Cluster <al**@carrarosoftmasters.netwrote:
[CUT]
> That's the difference. I prefer code which is easily understandable..
You had trouble getting it to work in the first place. What happens
when you have to look at it six months or a year from now when you have
to work on it again? You'll go through all of his again to understand
what it does.
[CUT]

comment, comment, comment and comment again :-)
Commenting in the single line?
Just tell them to leave everything between <?php ?alone and it should
be OK, no reason to forced single line statements. About that, if you're
worried about that, then why not just code it on the single line on normal
code? Linebreaks aren't actually required in PHP, so you could just leave
them in, and when the code needs to be updated you can whip it into some
kind of formatted readable shape quite fast with any competent texteditor.

But the main reason for me posting here in this thread is about
commenting: I'd like to take the oppertunity advocate the user of the /x
modifier for regexes. These pesky little things are often forgotten in the
commenting, while it's so easy.

Compare (not a very useful regex, just an illustration):

$regex = '/(a|b){2,4}([^\s]+?)c{2,4}(.*?)q/si'

And
$regex = '/{a|b}{2,4} #start matching at 2 to 4 a's or b's in a row
([^\s]+?) #capture all non whitespace untill the next match
c{2,4} #match 2 to 4 c's
(.*?) #capture any character
q #until q
/six'; //case-insensite, with comments

Now, that will be a lot easier altered and understood by coworkers I'd
imagine..
--
Rik Wasmus
Feb 14 '07 #9

P: n/a
Generale Cluster wrote:
Jerry Stuckle ha scritto:
>Generale Cluster wrote:
>>Jerry Stuckle ha scritto:
Rik wrote:
Generale Cluster <al**@carrarosoftmasters.netwrote:
[CUT]
>>
That's the difference. I prefer code which is easily understandable.

You had trouble getting it to work in the first place. What happens
when you have to look at it six months or a year from now when you
have to work on it again? You'll go through all of his again to
understand what it does.
[CUT]

comment, comment, comment and comment again :-)

bye!
Yes, I agree code should be commented. But it still should be easy to
understand.
--
==================
Remove the "x" from my email address
Jerry Stuckle
JDS Computer Training Corp.
js*******@attglobal.net
==================
Feb 14 '07 #10

P: n/a
Rik wrote:
On Wed, 14 Feb 2007 02:12:32 +0100, Generale Cluster
<al**@carrarosoftmasters.netwrote:
>Jerry Stuckle ha scritto:
>>Generale Cluster wrote:
Jerry Stuckle ha scritto:
Rik wrote:
>Generale Cluster <al**@carrarosoftmasters.netwrote:
[CUT]
>> That's the difference. I prefer code which is easily understandable.
You had trouble getting it to work in the first place. What happens
when you have to look at it six months or a year from now when you
have to work on it again? You'll go through all of his again to
understand what it does.
[CUT]

comment, comment, comment and comment again :-)

Commenting in the single line?
Just tell them to leave everything between <?php ?alone and it should
be OK, no reason to forced single line statements. About that, if you're
worried about that, then why not just code it on the single line on
normal code? Linebreaks aren't actually required in PHP, so you could
just leave them in, and when the code needs to be updated you can whip
it into some kind of formatted readable shape quite fast with any
competent texteditor.

But the main reason for me posting here in this thread is about
commenting: I'd like to take the oppertunity advocate the user of the /x
modifier for regexes. These pesky little things are often forgotten in
the commenting, while it's so easy.

Compare (not a very useful regex, just an illustration):

$regex = '/(a|b){2,4}([^\s]+?)c{2,4}(.*?)q/si'

And
$regex = '/{a|b}{2,4} #start matching at 2 to 4 a's or b's in a row
([^\s]+?) #capture all non whitespace untill the next match
c{2,4} #match 2 to 4 c's
(.*?) #capture any character
q #until q
/six'; //case-insensite, with comments

Now, that will be a lot easier altered and understood by coworkers I'd
imagine..
--Rik Wasmus
Rik,

I agree - this makes a lot more sense, especially to those of us who are
regex-challenged. :-) I really do wish more people would comment their
regex's. It sometimes takes me a while to decode just what they're
trying to do.

--
==================
Remove the "x" from my email address
Jerry Stuckle
JDS Computer Training Corp.
js*******@attglobal.net
==================
Feb 14 '07 #11

This discussion thread is closed

Replies have been disabled for this discussion.