I have 2 arrays. One is an array of objects $placementObjects, the other an associative array $ads which contains something like:
[
'mobile' => [
'inner' => [
'units' => [
3 => [
'pos' => 0,
'tag' => 'mobileAd:articles',
],
],
'enabled' => '1',
],
'sidebar' => [
'units' => [
4 => [
'pos' => -1,
'tag' => 'mobileSidebarAd:articles',
],
],
],
],
'desktop' => [
'inner' => [
'units' => [
1 => [
'pos' => 0,
'tag' => 'desktopAd:articles',
],
2 => [
'pos' => 5,
'tag' => 'desktopAd:articles',
],
3 => [
'pos' => 10,
'tag' => 'desktopAd:articles',
],
],
'enabled' => '1',
],
'sidebar' => [
'units' => [
4 => [
'pos' => -1,
'tag' => 'desktopSidebarAd:articles',
],
],
],
],
]
I need to insert each unit tag into the array of objects as specified by the pos (position), which are enabled. The array items without enabled key and/or pos value of -1 should be ignored. I created a function which contains the following snippet:
if ($paginate && count($placementObjects) === 1) {
$totalObjects = count($placementObjects[0]);
} elseif ($paginate && count($placementObjects) > 1) {
$totalObjects = $objectsPerPage;
} else {
$totalObjects = count($placementObjects);
}
$totalPageObjects = ($objectsPerPage > $totalObjects) ? $totalObjects : $objectsPerPage;
if (!empty($placementObjects) && !empty($ads)) {
foreach ($ads as $placement) {
foreach ($placement as $item) {
if (isset($item['enabled'])) {
foreach ($item['units'] as $adUnit) {
if (-1 !== $adUnit['pos']) {
if ($paginate) {
foreach ($placementObjects as $key => $pageObjects) {
$countObjects = count($pageObjects);
if (0 === $adUnit['pos']) {
array_splice($placementObjects[$key], $adUnit['pos'], 0, "[[{$adUnit['tag']}]]");
continue;
} elseif ($totalPageObjects === $adUnit['pos'] && $countObjects >= $adUnit['pos']) {
$pos = $adUnit['pos'] + (count($pageObjects) - $totalPageObjects);
array_splice($placementObjects[$key], $pos, 0, "[[{$adUnit['tag']}]]");
continue;
}
$pageCtr = 0;
foreach ($pageObjects as $index => $object) {
if (is_object($object)) {
if ($pageCtr === $adUnit['pos']) {
array_splice($placementObjects[$key], $index, 0, "[[{$adUnit['tag']}]]");
break;
}
$pageCtr++;
}
}
}
} else {
if (0 === $adUnit['pos']) {
array_splice($placementObjects, $adUnit['pos'], 0, "[[{$adUnit['tag']}]]");
continue;
} elseif ($totalObjects === $adUnit['pos']) {
$pos = $adUnit['pos'] + (count($placementObjects) - $totalObjects);
array_splice($placementObjects, $pos, 0, "[[{$adUnit['tag']}]]");
continue;
}
$ctr = 0;
foreach ($placementObjects as $index => $object) {
if (is_object($object)) {
if ($ctr === $adUnit['pos']) {
array_splice($placementObjects, $index, 0, "[[{$adUnit['tag']}]]");
break;
}
$ctr++;
}
}
}
}
}
}
}
}
}
Where:
$paginateis abooleanin which the value is passed as a parameter to the function.$objectsPerPageis anintto specify how many items will be included in each page. Its value is also passed as a parameter to the function.
The outcome would be something like:
[
0 => '[[desktopAd:articles]]',
1 => object,
2 => '[[mobileAd:articles]]',
3 => object,
4 => object,
5 => object,
6 => object,
7 => object,
8 => '[[desktopAd:articles]]',
9 => object,
10 => object,
11 => object,
12 => object,
13 => object,
14 => object,
15 => '[[desktopAd:articles]]',
]
As it shows, I am using nested loops. While the function works as expected, I am afraid that the nested loops will cost me. What is the best approach to do this? How can I refactor my code to make it more efficient?