Если существует идентификатор в массиве foreach, для каждого ключа = & quot; id & quot; Переполнение стека

РЕДАКТИРОВАТЬ:

Я пытаюсь использовать метод Алекса, но у меня есть некоторые проблемы … поэтому я получаю первый массив как $ resultsAchievementsMe, например:

$requestAchievementsMe = (new \Facebook\FacebookRequest( $session, 'GET', '/me/achievements?fields=data&app_id_filter=7606995873455'))->execute()->getGraphObject(\Facebook\GraphUser::className());

$resultsAchievementsMe = $requestAchievementsMe ->asArray();
$tests = $resultsAchievementsMe['data'];

print_r($tests);

print_r, напишет это:

Array ( [0] => stdClass Object ( [data] => stdClass Object ( [importance] => 0 [achievement] => stdClass Object ( [id] => 6467916820996 [url] => https://www.***.com/test2.html [type] => game.achievement [title] => TITLE2!! ) ) [id] => 10206139019499208 ) )

этот массив, будет содержать более 1 достижения, пользователь разблокирует более одного …

теперь с этим:

     if (empty($resultsAchievementsMe)) {
echo 'no achievements unlocked for now';
}else {
foreach ($resultsAchievementsMe['data'] as $tests) {
$totalAchievementsMe .= '[["' . $tests->data->achievement->id .'"],["'. $tests->data->achievement->title.'"]],';
}
}

вывод будет прост:

[["6467916820996"],["TEST2!!"]],

Этот массив будет содержать больше информации, я имею в виду, больше достижений, потому что, если пользователь разблокирует новый, когда он перезапустит приложение, у этого массива будет другой массив с тем же методом (id), (имя достижения).

Теперь, этот другой массив, имеет все достижения, и я получаю с помощью аналогичного метода:

$requestAchievements = (new \Facebook\FacebookRequest( $session, 'GET', '/7606995873455/achievements'))->execute()->getGraphObject(\Facebook\GraphUser::className());

$resultsAchievements = $requestAchievements ->asArray();

print_r($resultsAchievements);

вывод print_r будет выглядеть так:

Array ( [0] => stdClass Object ( [url] => https://www.***.com/test2.html [type] => game.achievement [title] => TITLE2!! [image] => Array ( [0] => stdClass Object ( [url] => https://www.***.com/test2.png [width] => 198 [height] => 198 ) ) [description] => description achievement2 [updated_time] => 2015-02-22T14:51:54+0000 [data] => stdClass Object ( [points] => 100 ) [id] => 6467916820996 [application] => stdClass Object ( [id] => 7606995873455 [name] => myapp [url] => https://apps.facebook.com/myapp/ ) [context] => stdClass Object ( [display_order] => 0 ) ) [1] => stdClass Object ( [url] => https://www.***.com/test1.html [type] => game.achievement [title] => TEST1!! [image] => Array ( [0] => stdClass Object ( [url] => https://www.***.com/test1.png [width] => 198 [height] => 198 ) ) [description] => description achievement1 [updated_time] => 2015-02-22T14:51:46+0000 [data] => stdClass Object ( [points] => 50 ) [id] => 7829964917383 [application] => stdClass Object ( [id] => 7606995873455 [name] => EatSquare [url] => https://apps.facebook.com/myapp/ ) [context] => stdClass Object ( [display_order] => 0 ) ) )

Этот массив содержит больше информации, например, описание достижения, URL-адрес картинки … и т. Д. … но с помощью метода, аналогичного описанному ранее:

$expic = "png";
foreach ($resultsAchievements as $result) {

$totalAchievements .= '[["' . $result->data->points .'"],["'. $UNLOCKED? .'"],["'. $result->title .'"],["'. $result->description .'"],["'. $result->id .'"],["'.  $result->url = substr($result->url, 0, -4).$expic.'"]],';
}

Я получу это:

[["100"],["TEST2!!"],["VARIABLE I NEED TO MAKE**"],["description achievement2"],["6467916820996"],["https://www.***.com/test2.png"]],[["50"],["TEST1!!"],["VARIABLE I NEED TO MAKE**"],["description achievement1"],["7829964917383"],["https://www.***.com/test1.png"]],

Теперь вы можете видеть, что у пользователя есть идентификатор test2 (6467916820996), разблокированный из первого массива … но я хотел бы сделать только один массив и вставить новое значение во второй, чтобы увидеть идентификатор всех для каждого достижения разблокировано … итак, конечный результат будет выглядеть так:

[["100"],["TEST2!!"],["UNLOCKED**"],["description achievement2"],["6467916820996"],["https://www.***.com/test2.png"]],[["50"],["TEST1!!"],["LOCKED!!!**"],["description achievement1"],["7829964917383"],["https://www.***.com/test1.png"]],

Я пытаюсь этот метод Алекса, но не работает …

$testid=$result->id;
$exist=false;foreach($resultsAchievementsMe['data'] as $resultsAchievements){
if($testid ==  $result->id) {
$totalAchievements .= $result->data->points .'"],["'. $result->title .'"],["'. 'UNLOCKED' .'"],["'. $result->description .'"],["'. $result->id .'"],["'.  $result->url .'"],';
$exist=true;
break;
}
}
if ($exist == false) {
$totalAchievements .=$result->data->points .'"],["'. $result->title .'"],["'. 'LOCKED!!!' .'"],["'. $result->description .'"],["'. $result->id .'"],["'.  $result->url.'"],["';
}

у кого-то есть идеи? Я не могу использовать пример Ghost, потому что изменит символы вывода

благодарю вас 🙂

0

Решение

Ваша цель не на 100% ясна для меня.

ИМХО твой код должен быть переработан.

Но если вам нужно быстро исправить и вы уверены, что $resultsAchievementsMe включите только 1 элемент, чем вы можете попробовать эту строку:

$testid=$result->id;
if($testid == $resultsAchievementsMe['data'][0]['data']['achievement']['id'])) {

и если у вас есть много в $resultsAchievementsMe Вы должны использовать цикл (или создать некоторую функцию):

    $testid=$result->id;
$exist=false;
foreach($resultsAchievementsMe['data'] as $myAchievement){
if($testid ==  $myAchievement['data']['achievement']['id'])) {
$totalAchievements .= $result->data->points .'"],["'. $result->title .'"],["'. $result->description .'"],["'. $result->id .'"],["'.  $result->url'"],["'.'EXIST'.']';
$exist=true;
break;
}
}
if ($exist == false) {
$totalAchievements .=$result->data->points .'"],["'. $result->title .'"],["'. $result->description .'"],["'. $result->id .'"],["'.  $result->url'"],["'.'DOESN'T EXIST'.']';
}

и, кстати, я не понимаю, если вы действительно смешиваете array с json ты используешь [] а также {} но в JSON, если {} имею в виду object — не массив

В любом случае, я бы предпочел получить более подробное описание целей, более сложные примеры источников данных и перепроектировать этот фрагмент, чтобы использовать json в качестве json, массив в качестве массива и объекты в качестве объекта.

0

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

Других решений пока нет …

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