Применить обратный вызов к многомерному массиву - PullRequest
0 голосов
/ 08 марта 2011

У меня есть это в PHP:

$data = array("test"=>array("abc"=>"xyz"));

Я хочу добавить ' data: ' со значениями массива, поэтому для вывода будет data: xyz 'для этого $ data array.

Это просто образец. Как я могу сделать это с многомерными массивами. то есть; добавление строки со значениями многомерного массива? Могу ли я сделать с постоянными значениями в том же массиве, чтобы я мог использовать это снова?

Ответы [ 4 ]

4 голосов
/ 08 марта 2011

Есть функция PHP, "[применяет] пользовательскую функцию рекурсивно к каждому члену массива" , это array_walk_recursive () .

Вот пример дляPHP 5.3, который использует замыкание:

array_walk_recursive($data, function(&$str) { $str = "data:$str"; });

Если вы чувствуете себя модно, вы можете сделать его функцией, которая принимает настраиваемый префикс, например:

function prepend(&$v, $k, $prefix)
{
    $v = $prefix . $v;
}

array_walk_recursive($data, 'prepend', 'data:');
2 голосов
/ 15 октября 2012

Представьте, что вы хотите применить пользовательскую функцию к вашему массиву, но только к определенной паре ключ => значение, это моя улучшенная версия:

$data = array( "test" => array("abc" => "xyz", 'def'=> 2), 'test2' =>  array ( 'abc' => 'jkl', 'def' => 5) );
$keytochange = 'def';
$apply = 'md5';
$data = f($data,$keytochange,$apply);

function f($array, $keytochange, $apply) 
{
   foreach ($array as $key => $value) 
   {
      if (is_array($value))
         $array[$key] = f($value,$keytochange,$apply);
      else
         $array[$keytochange] = $apply( $value );
   }
   return $array;
}

print_r($data);

Вывод:

Array
(
    [test] => Array
        (
            [abc] => xyz
            [def] => c81e728d9d4c2f636f067f89cc14862c
        )
    [test2] => Array
        (
            [abc] => jkl
            [def] => e4da3b7fbbce2345d7772b0674a318d5
        )
)
1 голос
/ 08 марта 2011

Чтобы изменить каждый элемент в массиве, вы можете использовать функцию array_map()

Пример:

  function Prepend($s)
  {
    return 'Data:'.$s;
  }

  $old_array = array('abc','def','ghi','xyz');

  $new_Array = array_map('Prepend',$old_array);

  var_dump($old_array);
  var_dump($new_Array);

Вывод:

array
  0 => string 'abc' (length=3)
  1 => string 'def' (length=3)
  2 => string 'ghi' (length=3)
  3 => string 'xyz' (length=3)
array
  0 => string 'Data:abc' (length=8)
  1 => string 'Data:def' (length=8)
  2 => string 'Data:ghi' (length=8)
  3 => string 'Data:xyz' (length=8)
1 голос
/ 08 марта 2011

Если вас не волнует удобочитаемость и вы просто хотите serialise Array для дальнейшего использования:

<?php
$data = Array("test" => Array("abc" => "xyz"));
$str  = serialize($data);

echo 'data:' . $str;
print_r(unserialize($str));

// data:<some characters here>
// Array("test" => Array("abc" => "xyz"));
?>

Если вы пытаетесь изменить исходный массив, напримерчто текст «data:» добавляется к каждому значению в массиве на каждом уровне:

<?php
$data = Array("test" => Array("abc" => "xyz"));

function f($array) {
   foreach ($array as $key => $value) {
      if (is_array($value))
         $array[$key] = f($value);
      else
         $array[$key] = "data:" . $value;
   }
   return $array;
}
$data = f($data);
print_r($data);

// Output: Array("test" => Array("abc" => "data:xyz"));
?>
...