2

How can I replace a string/word that's inside a multidimensional array with a new value? I don't have its key, just know the haystack and the needle.

Say I have a multidimensional array, $submenu_arr, (don't know how many dimensions).

I want to find a value inside one of these arrays and replace it with a new value.

Actually for a translation.

Like:

 recursive_arr_translation('Article', $submenu_arr, 'Artigo');//"Artigo" is a Portuguese word for "Article".

I've tried this, but not working:

 function in_array_r($needle, $haystack, $new_value) {
        $found = false;
        foreach ($haystack as $key=>$value) {
        if ($value === $needle) { 
                $found = true; 
                $haystack[$key] = $new_value;
                return true;
            } elseif (is_array($value)) {
                $found = in_array_r($needle, $haystack[$key], $new_value); 
                if($found) { 
                    return true; 
                } 
            }    
        }
        return $found;
    }


in_array_r('Article', $submenu, 'Artigo');
in_array_r('Location', $submenu, 'Localização');

EDIT: Is working, but somehow, I don't get it working, I'm trying to translate a WordPress submenu word.

4
  • 1
    array_walk_recursive...?! Commented Sep 26, 2014 at 13:32
  • array_walk_recursive new to me Commented Sep 26, 2014 at 13:35
  • php.net/array_walk_recursive Commented Sep 26, 2014 at 13:35
  • @deceze could you give me an example? Commented Sep 26, 2014 at 13:36

1 Answer 1

8

You can use array_walk_recursive as suggested in the comments, and pass your original array as reference, allowing us to edit it.

<?php

$a = array("Giraffe", "Monkey", "Elephant", "Snake", 5, "other" => array("apple", "orange"));

array_walk_recursive($a, function(&$a) {
        if($a == "apple") {
             $a = "Banana";
        }
});

echo print_r($a, true);

https://eval.in/198978

So, now we have the basic logic, let's create a function with 3 parameters.

function replace_in_array($find, $replace, &$array) {
    array_walk_recursive($array, function(&$array) use($find, $replace) {
        if($array == $find) {
             $array= $replace;
        }
    });
    return $array;
}

$a = array("Giraffe", "Monkey", "Elephant", "Snake", 5, "other" => array("apple", "orange"));
echo print_r( replace_in_array("apple", "banana", $a), true);

https://eval.in/198989

Sign up to request clarification or add additional context in comments.

1 Comment

Currently the if ($array == $find) will also replace any value of 1 as it will see it as true. If you wish to make it identical use === instead of ==.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.