Странное поведение: неопределенный индекс, в то время как индекс правильный

Я пытаюсь получить доступ к значению из массива, который имеет глубину 3 уровня, но PHP сообщает, что индекс не определен, хотя он, безусловно, таков. Unset с использованием того же индекса работает отлично!

Код:

function CleanUpCharacters($c) //Remove unneeded information
{
for ($i = 0; $i < count($c); ++$i)
{
$c[$i]['character']['rank'] = $c[$i]['rank']; // Move rank in to char
$c[$i] = $c[$i]['character']; // Move subarray char's keys/values to parent array

unset($c[$i]['battlegroup']);
unset($c[$i]['level']);
unset($c[$i]['achievementPoints']);
unset($c[$i]['thumbnail']);

$c[$i]['specName'] = $c[$i]['spec']; // <--- Undefined index notice
unset($c[$i]['spec']); // <--- Works fine, no errors

unset($c[$i]['guild']);
unset($c[$i]['guildRealm']);
}

return $c;
}

Строка вызывает ошибку на самом деле $c[$i]['specName'] = $c[$i]['spec']['name']; Я удалил ['name'] чтобы увидеть, если это решило проблему, но это не так.

Вот скриншот нефильтрованного массива, $c:

введите описание изображения здесь

0

Решение

unset () всегда работает. Он не имеет возвращаемого значения и не вызовет ошибку или уведомление.

Unset пример с неопределенным var: http://ideone.com/4OcSkQ

<?php
unset($a);

В вашем коде вам нужно проверить наличие ключа, прежде чем вы сможете выполнить назначение.

    $c[$i]['specName'] = $c[$i]['spec']; // <--- Undefined index notice

становится

    if(array_key_exists('spec', $c[$i]) === true) { // test, if spec key exists
$c[$i]['specName'] = $c[$i]['spec'];         // assign from spec to specName
}

Если вам нужно зарегистрировать или обработать противоположный случай (если спецификация отсутствует), вы можете добавить еще:

    else {
echo 'Key "spec" was not found. Working on: ' . $i['name'] . '<br>';
}

Также вы можете удалить более одной переменной с помощью unset (), например так:

    unset(
$c[$i]['battlegroup'],
$c[$i]['level'],
$c[$i]['achievementPoints'],
$c[$i]['thumbnail']
);
1

Другие решения

Я не вижу здесь никакой ошибки. Кажется, что для некоторых записей spec может быть не установлен. Вы можете проверить это, изменив:

for ($i = 0; $i < count($c); ++$i) {

в

for ($i = 0; $i < count($c); ++$i) {
if (!isset($c[$i]['character']['spec']) {
echo "no spec in array! for ".$i."<br />";
}
1

По вопросам рекламы [email protected]