Как заставить элемент быть в форме массива (в php)

#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
  ) ;