Поэтому я пытаюсь изменить массив и ДОБАВИТЬ что-то до последнего элемента в цикле, когда я запускаю этот код:
$data = ($json['data']);
foreach($data as $item){
if(isset($item['Metadata']) && $item['Metadata']['id_suscripcion'] == $id_sus){
if ($item === end($data))
echo $item['id'].' LAST ELEMENT!';
}
}
Я получаю такие результаты:
Array
(
[ticketNumber] => 172252526529700541
[Metadata] => Array
(
[id_suscripcion] => 0000000000004314
)
[id] => 193172252526529772
)
Array
(
[ticketNumber] => 172242526591400527
[Metadata] => Array
(
[id_suscripcion] => 0000000000004314
)
[id] => 193172242526591380
)
Array
(
[ticketNumber] => 172232526775600149
[Metadata] => Array
(
[id_suscripcion] => 0000000000004314
)
[id] => 193172232526775687
)
193172232526775687 LAST ELEMENT!
Теперь проблема в том, когда я добавляю array_reverse () $data = array_reverse($json['data']);
ПОСЛЕДНИЙ ЭЛЕМЕНТ! не покажет, есть предложения?
Если вам нужно добавить что-то для каждого массива внутри $ data и что-то дополнительное для последнего, я предлагаю вам разбить его или использовать цикл for для подсчета.
$data = array_reverse($json['data']);
for($i = 0; $i < count($data); $i++){
if( isset( $data[$i]['Metadata'] ) && $data[$i]['Metadata']['id_suscripcion'] == $id_sus){
if ( $i ===0 || $data[$i] === reset( $data ) )
echo $item['id'].' LAST ELEMENT!';
}
}
Я знаю, что вы сказали, что хотите, чтобы он выполнялся в цикле, но вам может быть лучше, чтобы циклы выполняли работу, которую они должны делать, а после циклов выполняйте свою работу с последним элементом:
$data = ($json['data']);
foreach($data as $item){
// Other work for looping...
}
$last = end($data);
$key = key($data);
if(isset($last['Metadata']) && $last['Metadata']['id_suscripcion'] == $id_sus){
echo $last['id'].' LAST ELEMENT!';
}
Это позволит сократить количество тестов в цикле.
Другой вариант может заключаться в том, чтобы получить последний ключ перед циклом (чтобы сократить зацикленные вызовы функций):
$data = ($json['data']);
// $data = array_reverse($data);
end($data);
$last_key = key($data);
foreach($data as $key => $item){
if(isset($item['Metadata']) && $item['Metadata']['id_suscripcion'] == $id_sus){
if ($key === $last_key)
echo $item['id'].' LAST ELEMENT!';
}
}
И, наконец, за реальный ответ, если вы пытаетесь добавлять Что-то в массив, вы захотите добавить его к фактическому элементу (что у вас есть, есть копия). Вы можете сделать это с помощью $item
в качестве ссылки или путем ссылки на элемент по ключу в содержащем массиве:
foreach($data as &$item){
if(isset($item['Metadata']) && $item['Metadata']['id_suscripcion'] == $id_sus){
if ($key === $last_key)
$item[] = 'LAST ELEMENT!';
}
}
Или же:
foreach($data as $key => $item){
if(isset($item['Metadata']) && $item['Metadata']['id_suscripcion'] == $id_sus){
if ($key === $last_key)
$data[$key][] = 'LAST ELEMENT!';
}
}
Если бы вы использовали мой первый кодовый блок, он бы выглядел примерно так:
foreach($data as $item){
// Other work for looping...
}
end($data);
$key = key($data);
$last &= $data[$key];
if(isset($last['Metadata']) && $last['Metadata']['id_suscripcion'] == $id_sus){
$last[] = 'LAST ELEMENT!';
}
И последний совет: isset
а также empty
не выбрасывайте ошибки при обращении к переменным или элементам массива / объекта, которые не заданы, так что вы можете (и вид должен) проверить весь путь перед тем, как получить к нему доступ, для здравого смысла и безопасности:
if (
isset($last['Metadata']['id_suscripcion']) &&
$last['Metadata']['id_suscripcion'] == $id_sus
) {
// do a thing
}
РЕДАКТИРОВАТЬ:
Если это все еще не работает при использовании array_reverse
вполне вероятно, что если это приход от json
Это может быть объект. Не забудьте расшифровать json
с объектами JS в качестве массивов: http://php.net/manual/en/function.json-decode.php