PHP смешанный ассоциативный массив, как получить значения в цикле foreach - PullRequest
0 голосов
/ 15 января 2019

Ну, у меня есть что-то вроде

$Arr1 = array("a1" => array("a1b", "a1b"),
              "a2" => array("a2b", "a2b"),
              "a3",
              "a4",
              "a5" => array("a5b", "a5b")
);

Мне нужно пройти через цикл foreach, чтобы получить $key => $value пару и единственный ключ, в котором нет значения.

Должно быть что-то с проверкой isset($value), но это не работает.

Примечание : я не знаю ключей, поэтому не могу позвонить $Arr1["a3"] напрямую

UPDATE: Вопрос закрыт. Спасибо всем. Как было написано, ключ без значения является не ключом, а значением с целочисленным ключом по умолчанию. Так что, если кто-то хочет использовать структуру выше, сделайте это

 foreach ($Arr1 as $key => $value) { 
      if (is_int($key)) { 
           $key = $value; 
           $value = null; 
      } 
      //using $key and $value
 }

Ответы [ 3 ]

0 голосов
/ 15 января 2019

Почему вы не устанавливаете значения "a3" и "a4" в пустой массив ("=> array ()")? Затем вы можете просмотреть и получить доступ к значениям с помощью клавиш «топор». В цикле вы обрабатываете данные, за исключением того, что массив пуст.

0 голосов
/ 15 января 2019

Ваш массив выглядит странно, так как вы смешиваете ключи и значения типа "a #". Это эквивалентно:

$Arr1 = array
(
  "a1" => array("a1b", "a1b"),
  "a2" => array("a2b", "a2b"),
  0    => "a3",
  1    => "a4",
  "a5" => array("a5b", "a5b")
);

Полагаю, вы имели в виду именно это:

$Arr1 = array
(
  "a1" => array("a1b", "a1b"),
  "a2" => array("a2b", "a2b"),
  "a3" => null,
  "a4" => null,
  "a5" => array("a5b", "a5b")
);

Тогда вы можете получить к нему доступ через foreach:

foreach ($Arr1 as $key => $value)
  echo "$key => " .
       ( is_array($value)
           ? implode(', ', $value)
           : $value
       ),
       '<br>', PHP_EOL
  ;

Или, если вы не хотите ключи с пустыми значениями:

foreach ($Arr1 as $key => $value)
  if(is_array($value))
    echo "$key => ", implode(', ', $value), '<br>', PHP_EOL;

или просто

$filered = array_filter( $Arr1, function($v) { return is_array($v); } );

foreach ( $filered as $key => $sub_array)
  echo $key, ' => ', implode(', ', $sub_array), '<br>', PHP_EOL;
0 голосов
/ 15 января 2019

Каждый элемент массива имеет свой ключ. «a3» и «a4» не являются клавишами, это элементы, которые имеют цифровые клавиши. Вы убедитесь, что если вы сделаете var_dump из этого массива

array (size=5)
  'a1' => 
    array (size=2)
      0 => string 'a1b' (length=3)
      1 => string 'a1b' (length=3)
  'a2' => 
    array (size=2)
      0 => string 'a2b' (length=3)
      1 => string 'a2b' (length=3)
  0 => string 'a3' (length=2)
  1 => string 'a4' (length=2)
  'a5' => 
    array (size=2)
      0 => string 'a5b' (length=3)
      1 => string 'a5b' (length=3)

Вы можете получить элементы с помощью цифровых клавиш с функцией array_filter и проверкой типа ключа (например, с помощью функции is_int)

$arr = array(
    "a1" => array("a1b", "a1b"),
    "a2" => array("a2b", "a2b"),
    "a3",
    "a4",
    "a5" => array("a5b", "a5b")
);

$newArr = array_filter($arr, function($key) {
    return is_int($key);
}, ARRAY_FILTER_USE_KEY);

или foreach оператор:

$arr = array(
    "a1" => array("a1b", "a1b"),
    "a2" => array("a2b", "a2b"),
    "a3",
    "a4",
    "a5" => array("a5b", "a5b")
);

$newArr = [];
foreach ($arr as $key => $value) {
  if (is_int($key)) {
      $newArr[] = $value;
  }
}
...