array_push not working within function, PHP - php

I have this case when I have array_push inside function and then I need to run it inside foreach filling the new array. Unfortunately I can't see why this does not work. Here is the code:
<?php
$mylist = array('house', 'apple', 'key', 'car');
$mailarray = array();
foreach ($mylist as $key) {
online($key, $mailarray);
}
function online($thekey, $mailarray) {
array_push($mailarray,$thekey);
}
print_r($mailarray);
?>
This is a sample function, it has more functionality and that´s why I need to maintain the idea.
Thank you.

PHP treats arrays as a sort of “value type” by default (copy on write). You can pass it by reference:
function online($thekey, &$mailarray) {
$mailarray[] = $thekey;
}
See also the signature of array_push.

You need to pass the array by reference.
function online($thekey, &$mailarray) {

Related

is there a function that will add apostrophe to items inside an array

I'm trying to apostrophe to items in an array. and return that into another array
I know I can use foreach to display it but I need the items to be back inside an array.
from: array('blue','red','yellow');
to: array("'blue'","'red'","'yellow'");
please help
Yes.
Use this PHP function :
$array=array('blue','red','yellow');
foreach ($array as $key=>$item)
{
$new_array[$key]="'".$item."'";
}
print_r ($new_array);
With array_map :
function myfunc($n)
{
return("'".$n."'");
}
$a = array('blue','red','yellow');
$b = array_map("myfunc", $a);
print_r($b);
A slightly cleaner way:
function addQuotes($a)
{
return "'".$a."'";
}
$array = array('blue','red','yellow');
$array = array_map('addQuotes', $array);
A simple search would have landed you this very basic information though. Please give effort next time.

AND in a PHP foreach loop?

Is it possible to have an AND in a foreach loop?
For Example,
foreach ($bookmarks_latest as $bookmark AND $tags_latest as $tags)
You can always use a loop counter to access the same index in the second array as you are accessing in the foreach loop (i hope that makes sense).
For example:-
$i = 0;
foreach($bookmarks_latest as $bookmark){
$result['bookmark'] = $bookmark;
$result['tag'] = $tags_latest[$i];
$i++;
}
That should achieve what you are trying to do, otherwise use the approach sugested by dark_charlie.
In PHP 5 >= 5.3 you can use MultipleIterator.
Short answer: no. You can always put the bookmarks and tags into one array and iterate over it.
Or you could also do this:
reset($bookmarks_latest);
reset($tags_latest);
while ((list(, $bookmark) = each($bookmarks_latest)) && (list(,$tag) = each($tags_latest)) {
// Your code here that uses $bookmark and $tag
}
EDIT:
The requested example for the one-array solution:
class BookmarkWithTag {
public var $bookmark;
public var $tag;
}
// Use the class, fill instances to the array $tagsAndBookmarks
foreach ($tagsAndBookmarks as $bookmarkWithTag) {
$tag = $bookmarkWithTag->tag;
$bookmark = $bookmarkWithTag->bookmark;
}
you can't do that.
but you can
<?php
foreach($keyval as $key => $val) {
// something with $key and $val
}
the above example works really well if you have a hash type array but if you have nested values in the array I recommend you:
or option 2
<?php
foreach ($keyval as $kv) {
list($val1, $val2, $valn) = $kv;
}
No, but there are many ways to do this, e.g:
reset($tags_latest);
foreach ($bookmarks_latest as $bookmark){
$tags = current($tags_latest); next($tags_latest);
// here you can use $bookmark and $tags
}
No. No, it is not.
You'll have to manually write out a loop that uses indexes or internal pointers to traverse both arrays at the same time.
Yes, for completeness:
foreach (array_combine($bookmarks_latest, $tags_latest) as $bookm=>$tag)
That would be the native way to get what you want. But it only works if both input arrays have the exact same length, obviously.
(Using a separate iteration key is the more common approach however.)

foreach array function storing in a variable?

$numbers = array('1','2');
$numberlist = foreach($numbers as $number) {
echo $number;
}
As you can see what I'm trying to do it doesn't work is there any other way to store a foreach function as a variable?
$numberList = function( $input )
{
foreach( $input as $v )
echo $v;
};
$numberList( $numbers );
See PHP Anon
Note: Anonymous functions are available since PHP 5.3.0.
(The function should be $numberList with a capital L in order for it to work properly.)
If you're trying to store a code reference to the foreach loop in the $numberlist variable, that can't be done: loops are not functions.
If you want an object you can cycle on, you need to build an interator. If this is the case, I suggest you take a look at Standard PHP Library.
I think what Matthew is trying to do is store a function in a variable in PHP. I think this link is what you're looking for:
http://php.net/manual/en/functions.variable-functions.php

preg_replace_callback stuck

I have an array of URLs I'm running thru an included preg_replace_callback function, the idea being that each loop will yield a new result.
Problem is that it keeps outputting only the first result, as if it stalls after processing the first URL.
Here is the code:
if (!function_exists('name')) {
function name($match)
{
return($match[1]);
}
$foo = preg_replace_callback("#[regex]#", "name", $bar);
}
Any ideas how I can get this to work properly? Thanks.
You can also use T-Regx library:
pattern('[regex]')->replace($bar)->callback('name');
If you are applying the function preg_replace_callback() to all elements in an array, you might want to do this:
// put this on the top of the file
function name($match) {
return($match[1]);
}
Then, to iterate through elements of an array:
foreach ($array as $value) {
$foo = preg_replace_callback("#[regex]#", "name", $value);
// do stuff with $foo
}

Make 1d Array from 1st member of each value in 2d Array | PHP

How can you do this? My code seen here doesn't work
for($i=0;i<count($cond);$i++){
$cond[$i] = $cond[$i][0];
}
It can be as simple as this:
$array = array_map('reset', $array);
There could be problems if the source array isn't numerically index. Try this instead:
$destinationArray = array();
for ($sourceArray as $key=>$value) {
$destinationArray[] = $value[0]; //you may want to use a different index than '0'
}
// Make sure you have your first array initialised here!
$array2 = array();
foreach ($array AS $item)
{
$array2[] = $item[0];
}
Assuming you want to have the same variable name afterwards, you can re-assign the new array back to the old one.
$array = $array2;
unset($array2); // Not needed, but helps with keeping memory down
Also, you might be able to, dependant on what is in the array, do something like.
$array = array_merge(array_values($array));
As previously stated, your code will not work properly in various situation.
Try to initialize your array with this values:
$cond = array(5=>array('4','3'),9=>array('3','4'));
A solution, to me better readable also is the following code:
//explain what to do to every single line of the 2d array
function reduceRowToFirstItem($x) { return $x[0]; }
// apply the trasnformation to the array
$a=array_map('reduceRowTofirstItem',$cond);
You can read the reference for array map for a thorough explanation.
You can opt also for a slight variation using array_walk (it operate on the array "in place"). Note that the function doesn't return a value and that his parameter is passed by reference.
function reduceToFirstItem(&$x) { $x=$x[0]; }
array_walk($cond, 'reduceToFirstItem');
That should work. Why does it not work? what error message do you get?
This is the code I would use:
$inArr;//This is the 2D array
$outArr = array();
for($i=0;$i<count($inArr);$i++){
$outArr[$i] = $inArr[$i][0];
}

Categories