#php #arrays #multidimensional-array
#php #массивы #многомерный массив
Вопрос:
У меня есть код, который выполняет итерацию по массиву элементов, которые сами по себе являются массивами. Код отлично работает для 2 или более таких элементов. Однако это НЕ работает для ОДНОГО «элемента» массива (потому что он начинает перебирать каждый из его подэлементов).
мой код:
foreach($list as $element)
...
большую часть времени $list является:
Array
(
[0] => Array
(
[a] => 'abc'
[b] => 'bcd'
)
[1] => Array
(
[a] => 'abc'
[b] => 'bcd'
)
)
это работает нормально, но если $list является:
Array
(
[a] => 'abc'
[b] => 'bcd'
)
очевидно, что мой код теперь испортился бы, поскольку foreach выполнял бы итерации через ‘a’ и ‘b’.
Я хочу преобразовать:
Array
(
[a] => 'abc'
[b] => 'bcd'
)
в:
Array
(
[0] => Array
(
[a] => 'abc'
[b] => 'bcd'
)
)
самым эффективным из возможных способов!
Комментарии:
1. Я действительно не понял вопроса, но пробовали ли вы вместо этого функцию is_array() …?
2. да — это тоже не сработало бы… давайте я попробую объяснить еще раз — извините за неясность (см. Основной вопрос)
3. @Treffynnon @MEsch @Nemoden — пожалуйста, посмотрите
Ответ №1:
Используйте is_array()
(связанный), чтобы определить, является ли переданный элемент массивом или нет. Затем вы можете обработать его соответствующим образом.
foreach($somethingarray['something'] as $something) {
if(is_array($something)) {
// do something with array
} else {
// do something with non array
}
}
Запустите это на http://www.phplint.com / чтобы увидеть результат, обратитесь к вашим комментариям @Frank D.
echo '<pre>';
$var = array( 'my_var' => array( 'my_value' ) );
var_dump( $var );
$var2 = array( $var );
var_dump( $var2 );
echo '</pre>';
Комментарии:
1. ммм — думайте об этом так, как я хочу, чтобы foreach работал как с array (a, b), так и с c
2. Да, я знаю и понимаю, в чем был ваш вопрос. Приведенный выше код является правильным способом обработки этого. Если вы хотите быть уверены, что всегда будете получать массив, попробуйте вставить
$something = array($something)
в предложение else выше.3. не работает, если это что-то само по себе уже является массивом… @Treffynnon
4. @Frank D Ты вообще пробовал это? Это действительно работает. Теперь это начинает мне надоедать. Смотрите мой обновленный ответ.
Ответ №2:
Используйте (array), чтобы заставить вашу переменную быть массивом, вот так:
foreach ((array)$somethingarray['something'] as $something) { /* $something is first array's element... And the only if you casted your "not-array" into an array by (array) */ }
Комментарии:
1. я не думаю, что это сработало бы, если бы $somethingarray[‘что-то’] был Array ( [a] => ‘abc’)
2. Итак, почему это работает даже после того, как вы сказали, что это не так? 🙂 dpaste.com/hold/531853 Мне просто любопытно, вы хотя бы пытались, прежде чем сделать заявление?
3. dpaste.com/531855 — В этом случае $arr[‘something’] — это array([a] => ‘abc’). Точно , как вы сказали.
4. @Nemoden — спасибо за ваш пост (и ссылку на pastebin), но это не то, что мне нужно. Пожалуйста, ознакомьтесь с уточненным объяснением выше
Ответ №3:
Как вы знаете, foreach будет выполнять итерацию по каждому элементу в массиве. Если массив пуст, он ничего не сделает. Итак, вы могли бы просто выполнить $var = array (); чтобы установить пустой массив.
Лучшим решением является проверка перед выполнением ваших инструкций foreach, является ли ввод массивом, используя in_array().
Комментарии:
1. предполагается, что он обрабатывает массивы, «массив» массивов …! 🙂
Ответ №4:
будьте осторожны при вставке вашего первого элемента
никогда не позволяйте $list быть
Array
(
[a] => 'abc'
[b] => 'bcd'
)
итак
//create your first element as
$firstElement=array('a'=>'abc','b'=>'bcd');
$list[] = $firstElement;
// or in one sentence: $list[] = array('a'=>'abc', 'b'=>'bcd');
// call your function here for one elment array
yourFunc($list)
// and so on the same way (how did you made the two elements $list array?)
$secondElement = array('a'=>'abc', 'b'=>'bcd');
$list[] = $secondElement;
// call your function here for two elments array
yourFunc($list)
Ответ №5:
В итоге проверил отдельный элемент, существовал ли конкретный элемент (известный как существующий только В массиве массивов) на нижнем уровне, затем сделал что-то вроде:
$list = Array
(
[0] => $list
) ;