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
}
Related
I am working on a WordPress plugin for a specific theme but have a general question,
I have an array and want to do something with each object and return the result.
everything is Ok but the "foreach" only works for the first object of array and I think its because of "return" but for some reasons I cannot use "echo" instead of return.
this is my code:
$cast_list = array(
"composite_cast",
"graphic_designer_cast",
"product_manager_cast",
"render_cast",
"the3d_cast",
"story_board_cast"
);
foreach ($cast_list as $value)
{
$user_field = get_field($value);
}
return $user_field;
}
I have read other similar topics but passing the variable to another function to do the "return" job for me also not works
Your doubt: the "foreach" only works for the first object of array and I think its because of "return"
No this not for return it's because of variable overwriting inside the foreach() loop every time. Actually you're not returning only the first element, here you're returning the last element because you're overwriting $user_field variable every time within foreach() loop
Try instead to push result to it using $user_field[] and then you're good to go
$cast_list = array(
"composite_cast",
"graphic_designer_cast",
"product_manager_cast",
"render_cast",
"the3d_cast",
"story_board_cast"
);
foreach ($cast_list as $value)
{
$user_field[] = get_field($value);
}
return $user_field;
All the functions work until the return keyword. You need to create a new array and append all the edited elements to it and then return it.
$user_fields = array();
foreach ($cast_list as $value)
{
array_push($user_fields, get_field($value));
}
return $user_fields;
Or you even can work on each field right in the loop and return nothing.
I have come across a PHP foreach statement that I am having trouble finding any documentation on.
Here is the code I am having trouble understanding:
<?php foreach((array)$this->item->partno as $value): ?>
// do some stuff
<?php endforeach; ?>
What is the (array) doing and what is happening with this foreach?
You're casting (converting) whatever the type of $this->item->partno is, in an array.
More on this in the php docs here
This technique is useful when you have a function and you want it to take an argument that can be either a single value or an array. For example, you might normally do something like this:
function foo($items) {
if (!is_array($items)) {
$items = array($items);
}
foreach ($items as $item) {
// ...
}
}
By casting the variable to an array inline, you can avoid the explicit array check, and the code will work fine if you pass it either a single value or an array:
function foo($items) {
foreach ((array) $items as $item) {
// ...
}
}
foo(1);
foo([1, 2, 3]);
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.
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) {
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.)