Итерация через множественный массив и выполнение функции

У меня есть массив со следующей структурой:

Array ( [0] => Array ( [animal] => dog [color] => black ) [1] => Array ( [animal] => cat [color] => white ) [2] => Array ( [animal] => mouse [color] => grey [attributes] => Array ( [nickname] => snuggles [nickname] => buddy ) ) ) 

Теперь мне нужно выполнить функцию для каждого значения в массиве атрибутов. Так, например, капитализируйте SNUGGLES и BUDDY .

Это мой подход:

 $array = array( array("animal"=>"dog","color"=>"black"), array("animal"=>"cat","color"=>"white"), array("animal"=>"mouse","color"=>"grey", "attributes" => array("nicknames" => "snuggles", "nicknames" => "buddy")) ); foreach ( $array as $key => $value ) { foreach ( $value as $key1 => $value1 ) { if ($key1 == 'attributes') { foreach ( $value as $key2 => $value2 ) { $value2 = strtoupper($value2); $array [$key] [$key1] [$key2]= $key2; } } } } 

Но я получаю эту ошибку:

strtoupper () ожидает, что параметр 1 будет строкой, массив указан в …

Related of "Итерация через множественный массив и выполнение функции"

Вы используете неправильную переменную во внутреннем цикле:

 foreach ( $value as $key2 => $value2 ) { ^^^^^^ here ... } 

Судя по коду, вы бы хотели использовать $value1 :

 foreach ( $value1 as $key2 => $value2 ) { ^^^^^^^ here ... } 

Предполагая, что dropdown => attributes

Простой способ сделать это.

 foreach ( $array as $key => $value ) { /* check whether the index is available or not */ if( isset( $value['attributes'] ) ) { foreach ( $value['attributes'] as $namekey => $names ) { /* here capitalise the value and save in same index */ $array[$key]['attributes'][$namekey] = strtoupper($names); } } } print_r($array); 

ВЫВОД-х:

 Array ( [0] => Array ( [animal] => dog [color] => black ) [1] => Array ( [animal] => cat [color] => white ) [2] => Array ( [animal] => mouse [color] => grey [attributes] => Array ( [nicknames] => BUDDY ) ) ) 

// Код: для использования каждого значения. Вы можете использовать ниже:

 $array = array( array("animal"=>"dog","color"=>"black"), array("animal"=>"cat","color"=>"white"), array("animal"=>"mouse","color"=>"grey", "attributes" => array("nickname1" => "snuggles", "nickname2" => "buddy")) ); foreach ( $array as $index => $value ) { foreach ( $value as $key1 => $value1 ) { if(is_array($value1)) { foreach ( $value1 as $key2 => $value2 ) { if(is_array($value2)) { foreach ( $value2 as $key3 => $value3 ) { $array[$index][$key1][$key2][$key3] = strtoupper($value3); } } else { $array[$index][$key1][$key2] = strtoupper($value2); } } } else { $array[$index][$key1] = strtoupper($value1); } } } 

Вывод :

  Array ( [0] => Array ( [animal] => DOG [color] => BLACK ) [1] => Array ( [animal] => CAT [color] => WHITE ) [2] => Array ( [animal] => MOUSE [color] => GREY [attributes] => Array ( [nickname1] => SNUGGLES [nickname2] => BUDDY ) ) ) 

Вы можете использовать array_map

Вы можете сделать это следующим образом:

Пусть входные данные (такие же, как у вас):

 $array = array:3 [ 0 => array:2 [ "animal" => "dog" "color" => "black" ] 1 => array:2 [ "animal" => "cat" "color" => "white" ] 2 => array:3 [ "animal" => "mouse" "color" => "grey" "attributes" => array:1 [ "nicknames" => "snuggles" "nicknames" => "buddy" ] ] ] 

Затем вы можете манипулировать через свой массив более простым и коротким способом:

 function toUpper($val) { if(is_array($val)) { return array_map('toUpper', $val); } return strtoupper($val); } $final_arr = array_map('toUpper', $array); print_r($final_arr); 

Это даст вам выход в соответствии с вашими входами:

 array:3 [ 0 => array:2 [ "animal" => "DOG" "color" => "BLACK" ] 1 => array:2 [ "animal" => "CAT" "color" => "WHITE" ] 2 => array:3 [ "animal" => "MOUSE" "color" => "GREY" "attributes" => array:1 [ "nicknames" => "BUDDY" ] ] ] 

Введенные вами входы имеют ключ массива с attributes который содержит массив, имеющий 2 значения одинаковых nicknames пары «ключ-значение». В этом случае это займет последнее.

Надеюсь это поможет!