Newsgroups: php.internals Path: news.php.net Xref: news.php.net php.internals:23112 Return-Path: Mailing-List: contact internals-help@lists.php.net; run by ezmlm Delivered-To: mailing list internals@lists.php.net Received: (qmail 9425 invoked by uid 1010); 3 May 2006 07:28:02 -0000 Delivered-To: ezmlm-scan-internals@lists.php.net Delivered-To: ezmlm-internals@lists.php.net Received: (qmail 9408 invoked from network); 3 May 2006 07:28:02 -0000 Received: from unknown (HELO lists.php.net) (127.0.0.1) by localhost with SMTP; 3 May 2006 07:28:02 -0000 X-PHP-List-Original-Sender: eric@aplosmedia.com X-Host-Fingerprint: 70.85.198.202 ca.c6.5546.static.theplanet.com Linux 2.4/2.6 Received: from ([70.85.198.202:47229] helo=orange.aplosmedia.com) by pb1.pair.com (ecelerity 2.0 beta r(6323M)) with SMTP id 97/90-04906-08B58544 for ; Wed, 03 May 2006 03:28:00 -0400 Received: (qmail 6392 invoked from network); 3 May 2006 03:27:56 -0400 Received: from c-71-195-82-162.hsd1.pa.comcast.net (HELO ?10.1.1.2?) (71.195.82.162) by ce.c6.5546.static.theplanet.com with SMTP; 3 May 2006 03:27:56 -0400 In-Reply-To: <44585828.1030603@vocalspace.com> References: <44584619.60400@lorenso.com> <200605030815.34801.johannes@php.net> <44585828.1030603@vocalspace.com> Mime-Version: 1.0 (Apple Message framework v749.3) Content-Type: multipart/signed; micalg=sha1; boundary=Apple-Mail-3-830343022; protocol="application/pkcs7-signature" Message-ID: Cc: PHPdev , dante@lorenso.com Date: Wed, 3 May 2006 03:27:47 -0400 To: D. Dante Lorenso X-Mailer: Apple Mail (2.749.3) Subject: Re: [PHP-DEV] Seeking 'coalesce' php internal function From: eric@aplosmedia.com (Eric Coleman) --Apple-Mail-3-830343022 Content-Transfer-Encoding: 7bit Content-Type: text/plain; charset=US-ASCII; delsp=yes; format=flowed http://us3.php.net/func_get_args http://us3.php.net/array Enjoy. Eric Coleman Eric Coleman http://aplosmedia.com home: 412 399 1024 cell: 412 779 5176 On May 3, 2006, at 3:13 AM, D. Dante Lorenso wrote: > Johannes Schlueter wrote: >> please search the archives for "ifsetor". >> > > I have completed this search and find: > > http://marc.theaimsgroup.com/?r=1&w=2&q=b&l=php-dev&s=coalesce > http://marc.theaimsgroup.com/?l=php-dev&w=2&r=1&s=ifsetor&q=b > > I am using PHP 5.1.2 currently and thought using pass-by-reference > was frowned upon. Assuming a mistaken assumption I move forward > and see the following code which was presented to the list: > > function ifsetor(&$var, $value) { > return (isset($var)) ? $var : $value; > } > print ifsetor($x, "dante"); > ?> > > This works as I'd like in my dev environment, however, this does > not solve the problem of allowing variable number of parameters > (variables and values). So, I've whipped up this 10 variable version: > > function ifsetor(&$var1, &$var2, &$var3, &$var4, &$var5, &$var6, & > $var7, &$var8, &$var9, &$var10) { > if (isset($var1)) return $var1; > if (isset($var2)) return $var2; > if (isset($var3)) return $var3; > if (isset($var4)) return $var4; > if (isset($var5)) return $var5; > if (isset($var6)) return $var6; > if (isset($var7)) return $var7; > if (isset($var8)) return $var8; > if (isset($var9)) return $var9; > if (isset($var10)) return $var10; > return false; > } > print ifsetor($x["notset"]->notset, $y["notset"]->notset, $z- > >notset, "dante"); > ?> > > PHP Fatal error: Only variables can be passed by reference in .../ > ifsetor.php on line 15 > PHP Warning: Missing argument 5 for ifsetor(), called in .../ > ifsetor.php on line 15 and defined in .../ifsetor.php on line 2 > PHP Warning: Missing argument 6 for ifsetor(), called in .../ > ifsetor.php on line 15 and defined in .../ifsetor.php on line 2 > PHP Warning: Missing argument 7 for ifsetor(), called in .../ > ifsetor.php on line 15 and defined in .../ifsetor.php on line 2 > PHP Warning: Missing argument 8 for ifsetor(), called in .../ > ifsetor.php on line 15 and defined in .../ifsetor.php on line 2 > PHP Warning: Missing argument 9 for ifsetor(), called in .../ > ifsetor.php on line 15 and defined in .../ifsetor.php on line 2 > PHP Warning: Missing argument 10 for ifsetor(), called in .../ > ifsetor.php on line 15 and defined in .../ifsetor.php on line 2 > > I can work around passing values by reference by calling the > function like this: > > print ifsetor($x["notset"]->notset, $y["notset"]->notset, $z- > >notset, $temp = "dante"); > > But you have to admit that's getting ugly and still, there are > undefined parameters declared ... so then I tried it by assigning > default values: > > function ifsetor(&$var1=null, &$var2=null, &$var3=null, & > $var4=null, &$var5=null, &$var6=null, &$var7=null, &$var8=null, & > $var9=null, &$var10=null) { > if (isset($var1)) return $var1; > if (isset($var2)) return $var2; > if (isset($var3)) return $var3; > if (isset($var4)) return $var4; > if (isset($var5)) return $var5; > if (isset($var6)) return $var6; > if (isset($var7)) return $var7; > if (isset($var8)) return $var8; > if (isset($var9)) return $var9; > if (isset($var10)) return $var10; > return false; > } > print ifsetor($x["notset"]->notset, $y["notset"]->notset, $z- > >notset, $temp = "dante")."\n"; > print_r($x); > ?> > > Now, $x, $y, and $z ARE set ... > > dante > Array ( [notset] => stdClass Object ( [notset] => ) ) > > This is a nasty side-effect and can not be accepted. I did not > want to set these variables, just check their existance. > > I am willing to go away and concede that this should be done in > userspace IF you can show me that it is in fact possible. The 2 > argument ifsetor is trivial in userspace, yes, but the variable > case is more useful in a variety of situations and provides the > most benefit to simplify code. I did not find the answer in the > archives. Can you point me in the right direction? I need to be > able to do all of the following: > > * variable number of parameters > * test 'isset' or 'empty' > * testing variables and non-variable values (pass-by-reference > won't > work on values) > * not have side-effect of defining values which are not already set > * not trigger notices or warnings > * returns value of first proper match > > Dante > >> johannes >> >> On Wednesday 03 May 2006 07:56, D. Dante Lorenso wrote: >> >>> All, >>> >>> I'm sure this has been asked somewhere, but since I see requests for >>> features for 5.2 or 6.0, I'd like to add a "simple" item to the list >>> which would be quite useful to me and would simplify and clean up >>> a lot >>> of code out there: >>> >>> function coalesce(...) >>> >>> This works much like in the SQL version of the same. In SQL, the >>> function returns the first non-null argument from an arbitrary >>> list. In >>> our use, it should return the first non-empty value from the list: >>> >>> Example: >>> >>> $x = "dante"; >>> $y = ""; >>> $z = ""; >>> >>> $value = coalesce($z, $y, $x); // $value = "dante" >>> >>> This function would ideally be built into the language and bypass >>> warnings about undefined variables like 'empty' does. It might >>> be nice >>> to have several varieties of this function: >>> >>> * return first parameter where empty() is FALSE >>> * return first parameter where isset() is TRUE >>> >>> I don't think something like this can NOT be written in userspace >>> because the 'isset' and 'empty' checks need to be run before >>> arguments >>> can be passed to a user function or warnings will start flying. A >>> function like this simplifies code which used to look like this: >>> >>> if (!empty($_POST["postkey"])) { >>> $value = $_POST["postkey"]; >>> } >>> elseif (!empty($_GET["getkey"])) { >>> $value = $_POST["getkey"]; >>> } >>> elseif (!empty($default_value)) { >>> $value = $default_value; >>> } >>> else { >>> $value = "hard coded value"; >>> } >>> >>> Into this: >>> >>> $value = coalesce($_POST["postkey"], $_GET["getkey"], >>> $default_value, "hard coded value"); >>> >>> Can this be built and included? >>> >>> Dante >>> >> >> > > -- > PHP Internals - PHP Runtime Development Mailing List > To unsubscribe, visit: http://www.php.net/unsub.php > --Apple-Mail-3-830343022 Content-Transfer-Encoding: base64 Content-Type: application/pkcs7-signature; name=smime.p7s Content-Disposition: attachment; filename=smime.p7s MIAGCSqGSIb3DQEHAqCAMIACAQExCzAJBgUrDgMCGgUAMIAGCSqGSIb3DQEHAQAAoIIKzjCCAuAw ggJJoAMCAQICEEDX/oJeKJttmENJSQuO0oEwDQYJKoZIhvcNAQEEBQAwYjELMAkGA1UEBhMCWkEx JTAjBgNVBAoTHFRoYXd0ZSBDb25zdWx0aW5nIChQdHkpIEx0ZC4xLDAqBgNVBAMTI1RoYXd0ZSBQ ZXJzb25hbCBGcmVlbWFpbCBJc3N1aW5nIENBMB4XDTA2MDIyNzIzNDczNFoXDTA3MDIyNzIzNDcz NFowRTEfMB0GA1UEAxMWVGhhd3RlIEZyZWVtYWlsIE1lbWJlcjEiMCAGCSqGSIb3DQEJARYTZXJp Y0BhcGxvc21lZGlhLmNvbTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALiS5nVqLGE4 FGAoA5nTNxH301Uujyfq6yNb7so83yi1GA/sbZOKHJLdKsc94JGY91iIbLtcwWXQxwuPMUqpExPG HpXPgKOnTokoUnBtrRjvSAPKwH5GunO42HSMcG+cGvB8ARuMfjcLnDqyZqw4zIceIb7dzLwQPFMc 6HIqQCZwdVZ2+9LoFXYjJcp8dwzBJ6ePire5GllSvszo2oIL3Mpy5VJ2TZv3W7JCzl3VxIpfFxgd it6uMN0LfKxGlI2KIqhlLL6XAr/UU4rYZmp650JknvnKzEc230dMOKLl27/mTbS9TKLD8uxcQsGv +1BW5YxAvSBzjZ+j43FXrcPbiKcCAwEAAaMwMC4wHgYDVR0RBBcwFYETZXJpY0BhcGxvc21lZGlh LmNvbTAMBgNVHRMBAf8EAjAAMA0GCSqGSIb3DQEBBAUAA4GBAF6NZq1sAVp1cR1flQP2oO7ybiyg Cncn6uuy/glNgFYkxx8yarhbAD8vTHbtwLzzUGMrg7o6aNk9poRtVUYXIPY0Kd/Up+4EMwlRMfj5 7RhLr77vf4C9S7UXMePXSd6uZxx0VNv3USXkyNDmQSjS8iqszpdVnoLmMRJZxVHx7OMiMIIDPzCC AqigAwIBAgIBDTANBgkqhkiG9w0BAQUFADCB0TELMAkGA1UEBhMCWkExFTATBgNVBAgTDFdlc3Rl cm4gQ2FwZTESMBAGA1UEBxMJQ2FwZSBUb3duMRowGAYDVQQKExFUaGF3dGUgQ29uc3VsdGluZzEo MCYGA1UECxMfQ2VydGlmaWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbjEkMCIGA1UEAxMbVGhhd3Rl IFBlcnNvbmFsIEZyZWVtYWlsIENBMSswKQYJKoZIhvcNAQkBFhxwZXJzb25hbC1mcmVlbWFpbEB0 aGF3dGUuY29tMB4XDTAzMDcxNzAwMDAwMFoXDTEzMDcxNjIzNTk1OVowYjELMAkGA1UEBhMCWkEx JTAjBgNVBAoTHFRoYXd0ZSBDb25zdWx0aW5nIChQdHkpIEx0ZC4xLDAqBgNVBAMTI1RoYXd0ZSBQ ZXJzb25hbCBGcmVlbWFpbCBJc3N1aW5nIENBMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDE pjxVc1X7TrnKmVoeaMB1BHCd3+n/ox7svc31W/Iadr1/DDph8r9RzgHU5VAKMNcCY1osiRVwjt3J 8CuFWqo/cVbLrzwLB+fxH5E2JCoTzyvV84J3PQO+K/67GD4Hv0CAAmTXp6a7n2XRxSpUhQ9IBH+n ttE8YQRAHmQZcmC3+wIDAQABo4GUMIGRMBIGA1UdEwEB/wQIMAYBAf8CAQAwQwYDVR0fBDwwOjA4 oDagNIYyaHR0cDovL2NybC50aGF3dGUuY29tL1RoYXd0ZVBlcnNvbmFsRnJlZW1haWxDQS5jcmww CwYDVR0PBAQDAgEGMCkGA1UdEQQiMCCkHjAcMRowGAYDVQQDExFQcml2YXRlTGFiZWwyLTEzODAN BgkqhkiG9w0BAQUFAAOBgQBIjNFQg+oLLswNo2asZw9/r6y+whehQ5aUnX9MIbj4Nh+qLZ82L8D0 HFAgk3A8/a3hYWLD2ToZfoSxmRsAxRoLgnSeJVCUYsfbJ3FXJY3dqZw5jowgT2Vfldr394fWxghO rvbqNOUQGls1TXfjViF4gtwhGTXeJLHTHUb/XV9lTzCCBKMwggOLoAMCAQICBEOaoYwwDQYJKoZI hvcNAQEEBQAwgZUxCzAJBgNVBAYTAlVTMQswCQYDVQQIEwJQQTERMA8GA1UEBxMITW9vbiBUd3Ax FDASBgNVBAoTC0FwbG9zIE1lZGlhMRMwEQYDVQQLEwpNYW5hZ2VtZW50MRcwFQYDVQQDEw5hcGxv c21lZGlhLmNvbTEiMCAGCSqGSIb3DQEJARYTZXJpY0BhcGxvc21lZGlhLmNvbTAeFw0wNTEyMTAw OTM2MTNaFw0wNjEyMTAwOTM2MTNaMIGVMQswCQYDVQQGEwJVUzELMAkGA1UECBMCUEExETAPBgNV BAcTCE1vb24gVHdwMRQwEgYDVQQKEwtBcGxvcyBNZWRpYTETMBEGA1UECxMKTWFuYWdlbWVudDEX MBUGA1UEAxMOYXBsb3NtZWRpYS5jb20xIjAgBgkqhkiG9w0BCQEWE2VyaWNAYXBsb3NtZWRpYS5j b20wggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQC9IbBR9KVzNjSvb2KnYYBy1/7FnueA M6p+rbf8QbqtZH2BmPZY/vuFapPGlqZb5pkVxCGEn32QM30RBD3GkoKRSepKrA0jw2gAcVkwrrDg 9APqoaJ5htrsYOpTZWaX0sif19Qx/gmJVoZZPBvt6TpRabvrSSJvqpHgZg3OxpFcizsB0rDZXttw VRzWrKPYHCnIcaSDp+BRMvq9EX2fmu7mDhYjjHj0oM4CRGjDQrTww+t1ToZbT40qlA37Yn3ijWnA WgGGmGGBhONBCGa9xQTkz4w0kLIaAXinW1v1+nP2GKX0h/AqiN2oNdWXwivFDIei9ZEPyWOnPJ5E 2VyGCIFFAgMBAAGjgfgwgfUwHQYDVR0OBBYEFPZ0fACGfi/R1rAVPuhQQyIQoa5JMIHFBgNVHSME gb0wgbqAFPZ0fACGfi/R1rAVPuhQQyIQoa5JoYGbpIGYMIGVMQswCQYDVQQGEwJVUzELMAkGA1UE CBMCUEExETAPBgNVBAcTCE1vb24gVHdwMRQwEgYDVQQKEwtBcGxvcyBNZWRpYTETMBEGA1UECxMK TWFuYWdlbWVudDEXMBUGA1UEAxMOYXBsb3NtZWRpYS5jb20xIjAgBgkqhkiG9w0BCQEWE2VyaWNA YXBsb3NtZWRpYS5jb22CBEOaoYwwDAYDVR0TBAUwAwEB/zANBgkqhkiG9w0BAQQFAAOCAQEAA0rE KJxUIfCAjuFySw3feB5+5lMuC8B8xqsh6FWKidFRvIRkM23eqPAzQ/bkCh+OtQnXZ6VRxNJwyDH7 diWaifR8MErFx0ZlYcKgGMXMkcNJp8Ob0x03oa/BEhrORgf5lCNUKcG6hAr6KZZvitGBKxJIzhVp bwm31KPB2HPGd20Ck2c3FIgyKfBXDm5+bltvvYA8bFbHqoS4FwPS0LwieNICdIOTiWzZ5XXepLLb /Me4SkfnJR2GZSvqCunuNdFmKodFRSKROMKCygYg711Yn33ioHrIQ3ErokPCbsRoeX4KNeejY94G CO8LvrpXCDyjsn6IbXsumLzVbfZNsG0j1DGCA2QwggNgAgEBMHYwYjELMAkGA1UEBhMCWkExJTAj BgNVBAoTHFRoYXd0ZSBDb25zdWx0aW5nIChQdHkpIEx0ZC4xLDAqBgNVBAMTI1RoYXd0ZSBQZXJz b25hbCBGcmVlbWFpbCBJc3N1aW5nIENBAhBA1/6CXiibbZhDSUkLjtKBMAkGBSsOAwIaBQCgggHD MBgGCSqGSIb3DQEJAzELBgkqhkiG9w0BBwEwHAYJKoZIhvcNAQkFMQ8XDTA2MDUwMzA3Mjc0N1ow IwYJKoZIhvcNAQkEMRYEFIg8bOC2xK4HZP4cI/Pg8JoK0slGMIGvBgkrBgEEAYI3EAQxgaEwgZ4w gZUxCzAJBgNVBAYTAlVTMQswCQYDVQQIEwJQQTERMA8GA1UEBxMITW9vbiBUd3AxFDASBgNVBAoT C0FwbG9zIE1lZGlhMRMwEQYDVQQLEwpNYW5hZ2VtZW50MRcwFQYDVQQDEw5hcGxvc21lZGlhLmNv bTEiMCAGCSqGSIb3DQEJARYTZXJpY0BhcGxvc21lZGlhLmNvbQIEQ5qhjDCBsQYLKoZIhvcNAQkQ AgsxgaGggZ4wgZUxCzAJBgNVBAYTAlVTMQswCQYDVQQIEwJQQTERMA8GA1UEBxMITW9vbiBUd3Ax FDASBgNVBAoTC0FwbG9zIE1lZGlhMRMwEQYDVQQLEwpNYW5hZ2VtZW50MRcwFQYDVQQDEw5hcGxv c21lZGlhLmNvbTEiMCAGCSqGSIb3DQEJARYTZXJpY0BhcGxvc21lZGlhLmNvbQIEQ5qhjDANBgkq hkiG9w0BAQEFAASCAQAVgcjRcf40Yhs6d28N5wXmIkPgRVH9EJYy+6R7ygjdXqCgTMBNLZuJyWWR nLVhTvdURgJg1clHQZkTQ7RvtHIWT6L/8JMV0GOdx9RjqnRIgTedHsvE6zsaAmkySe7TUozM2RKe XrJUUCze2Da99EhJgRe1/zkMO5jmiAR/fNO64EHpt9vuv8z2IfJ/B5tOmbMY6C2pY1xLvDpcxTgw jTVmNJLE0b1sG+TCdoJ1dSD1i1ryUKQMNrfCXXkeI2fEbHM4K4pTqTUO5PHzIZsPZqBpDOQVQ0VZ TmSrKhSIBf1L6EoEUio2YA7NAuEkzLzOC6d8z5lrAktKqGHzaDU9jO3oAAAAAAAA --Apple-Mail-3-830343022--