2014-04-01 3 views
1

Это то, что у меня есть:Добавление префикса в массив в массиве, а затем возвращая его

$tests = array(
    'id' => 'world', 
    'level2' => array(
     array(
      'id' => 'world2' 
     ), 
     array(
      'id' => 'world3' 
     ), 
     array(
      'id' => 'world4' 
     ), 
    ) 
); 

То, что я хочу - Приставка что-то вроде 'hello ' всем 'id' с в 'level2' массиве

Я «пробовал:

$tests = testing($tests); 

function testing($tests) { 
    foreach ($tests['level2'] as $test) { 
     $test['id'] = 'hello ' . $test['id']; 
    } 

    return $tests; 
} 

var_dump($tests); 

Результаты: array(2) { ["id"]=> string(5) "world" ["level2"]=> array(3) { [0]=> array(1) { ["id"]=> string(6) "world2" } [1]=> array(1) { ["id"]=> string(6) "world3" } [2]=> array(1) { ["id"]=> string(6) "world4" } } }

Проблема: не работает.

Кто-нибудь? Заранее спасибо.

ответ

3

Вы можете использовать ключ, чтобы изменить исходный массив:

$tests = testing($tests); 

function testing($tests) { 
    foreach ($tests['level2'] as $key=>$test) { 
     $tests['level2'][$key]['id'] = 'hello ' . $test['id']; 
    } 

    return $tests; 
} 

var_dump($tests); 
+0

Спасибо! Это сработало для меня. – Bobby

2

Проблема заключается в том, что при использовании цикла foreach, $test становится копией, поэтому обновление, что не будет обновлять исходный массив.

Вы можете исправить пропускание $ теста в качестве ссылки:

function testing($tests) { 
    foreach ($tests['level2'] as &$test) { 
     $test['id'] = 'hello ' . $test['id']; 
    } 

    return $tests; 
} 
+0

Прошу прощения, это не тот код, который точно такой же, как у меня? – Bobby

+0

Почти, он передаёт '$ test' в качестве ссылки, вместо этого использует **' & $ test' **. Который исправляет вашу проблему более компактно. – aurbano

3

В дополнении к другим ответам: PHP предлагает через array_map() функцию, так что вам не нужно использовать какую-либо петлю на всех.

function addToId($level) { 
    $level['id'] = 'hello'.$level['id']; 
    return $level; 
} 
function testing($tests) { 
    $tests['level'] = array_map('addToId', $tests['level']); 
    return $tests; 
} 

Здесь вам нужно только, чтобы убедиться, вы звоните array_map() на $tests['level'], а не сам $tests.

+0

Большое спасибо, это что-то новое для меня. – Bobby

Смежные вопросы