Получить текущий ключ массива внутри foreach

Итак, я создаю для своего работодателя что-то для того, чтобы они могли вводить продукты, у них есть очень конкретные требования. У меня есть форма с динамически генерируемыми полями, такими как … (очевидно, не точный код, который следует, но примеры идентичны концептуально)

<input type="text" name="attribute[20]"> inputted value = height <input type="text" name="attribute[27]"> inputted value = width 

числа генерируются на основе вещей в базе данных, поэтому 20 будет коррелировать с «шириной» 27, например, будет коррелировать с «высотой».

Поэтому, как только пользователь вводит значения, мне нужны эти значения для входа в базу данных … или в тесте, эхо.

 foreach ($_POST['attribute'] as $attributes){ echo key($attributes).' '.$attributes.'<br>'; } 

Так что вывести …

20 значение высоты
27 значение ширины

но вместо этого он выводит

значение высоты
значение ширины

Что происходит? У меня что-то похожее … но немного другое, поскольку определенные числа могут иметь более одного входа … который отлично работает.

 <input type="text" name="option[][20]"> inputted value = option 1 <input type="text" name="option[][20]"> inputted value = option 2 <input type="text" name="option[][27]"> inputted value = option 1 foreach ($_POST['option'] as $options){ echo key($options).' '; foreach ($options as $option){ echo $option.'<br>'; } 

который отлично выводит …

20 вариант 1
20 вариант 2
27 вариант 1

Я не понимаю, почему более сложный человек работает, а более простой – нет, пропал ли я что-то очевидное? Я знаю, что у меня есть несколько неортодоксальный метод кодирования по сравнению с некоторыми, но это то, что он lol. Любая помощь будет принята с благодарностью.

EDIT: сброс вара по запросу

array (22) {["pID"] => string (12) "test product" ["pPrice"] => string (0) "" ["pName"] => string (0) "" ["pRRP" ] => string (0) "" ["pPostSize"] => string (0) "" ["pOurPrice"] => string (0) "" ["pEstDelivery"] => string (0) "" [" pWeight "] => string (0)" "[" pEAN "] => string (0)" "[" pOrder "] => string (0)" "[" pStock "] => string (0)" " ["pufacturer"] => string (0) "" ["pType"] => string (13) "Душевые клапаны" ["pRange"] => string (0) "" ["cat"] => array ( 2) {[0] => string (2) "72" [1] => string (2) "23"} ["attribute"] => array (2) {[ 0 ] => string (5) " width [1] => string (6) "height"} ["option"] => array (3) {[0] => array (1) {[ 11 ] => string (6) " works1 "} [1] => array (1) {[ 10 ] => string (6) " works1 "} [2] => array (1) {[ 10 ] => string (6) " works2 "}} ["pLongdescription "] => string (0)" "[" meta_description "] => string (0)" "[" meta_keyword "] => string (0)" "[" meta_title "] => string (0)" "[ "action"] => string (6) "create"}

полужирным шрифтом, являются части, которые успешно выходят в моем втором примере. но жирным курсивом, как вы можете видеть, возвращает 0 вместо 20, который фактически находится в значении имени формы.

 <input type="text" name="attribute[20]"> inputted value = height <input type="text" name="attribute[27]"> inputted value = width foreach ($_POST['attribute'] as $attributes){ echo key($attributes).' '.$attributes.'<br>'; } 

Обратите внимание, что вы зацикливаете массив атрибутов в столбце. $ attributes – значение для каждого поля (и, следовательно, не является массивом.

Вместо использования key() попробуйте:

 foreach ($_POST['attribute'] as $attributeKey => $attributes){ echo $attributeKey.' '.$attributes.'<br>'; } 

Согласно документации PHP key () :

Функция key () просто возвращает ключ элемента массива, на который в данный момент указывается внутренний указатель. Он не перемещает указатель. Если внутренний указатель указывает на конец списка элементов или массив пуст, key () возвращает NULL .

Документация (и пример) показывает, что вам необходимо предоставить фактический массив в качестве параметра, в котором вы используете значение.

Поэтому используйте что-то вроде этого:

 $yourArray = $_POST['attribute']; foreach ($yourArray as $attributes){ echo key($yourArray).' '.$attributes.'<br>'; } 

Несмотря на то, что вы заметили, что знаете, что у вас есть «несколько неортодоксальный метод кодирования по сравнению с некоторыми», было бы гораздо лучше использовать foreach -loop таким образом:

 foreach ($_POST['attribute'] as $attributeKey => $attributes){ echo $attributeKey.' '.$attributes.'<br>'; } 

поскольку метод key() кажется мне «изворотливым» (зависит от внутренних указателей).

Ознакомьтесь с документацией foreach для получения дополнительной информации об этом использовании.

Итак, я исправил это, с помощью вас, ребята, и осознание того, что я был немного глупым и редактировал только статическую часть формы, чтобы включить динамический ключ, а не сгенерированную часть ajax, которая перезаписывает его.

 foreach ($_POST['attribute'] as $key => $attributes){ echo $key.'+'.$attributes.'<br>'; } 

Работает отлично. Спасибо за советы ребята.