У меня есть массив со следующей структурой:
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 будет строкой, массив указан в …
- Сортировка массива с размерами одежды и дополнительными значениями
- Сортировка массивов в многомерный массив с помощью ключа
- laravel Как получить доступ к столбцу с номером имени таблицы?
- Перемешивание массива php без того же значения до или после
- PHP array_multisort не сортирует мой многомерный массив, как ожидалось
Вы используете неправильную переменную во внутреннем цикле:
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
пары «ключ-значение». В этом случае это займет последнее.
Надеюсь это поможет!