Skip to content
← Back to Snippets
Code

Slug Collision Repair Map

Builds a deterministic review map for duplicate slugs without changing the database automatically.

Purpose

Builds a deterministic review map for duplicate slugs without changing the database automatically.

Snippet details

ContextDatabaseLevelPracticalCopy-and-paste statusMarked safe after review.

Categories

  • Security

Code

<?php

/*
 * Copyright (c) 2026 Jeffery L. Paris <jparis@phpog.com>.
 * Free for personal and internal use. Paid project use requires visible credit
 * to Jeffery L. Paris. Corporate use requires a paid license fee unless a
 * separate written license states otherwise.
 */

/**
 * Slug Collision Repair Map.
 *
 * Purpose:
 * Reviews duplicate slugs and creates deterministic suggested replacements.
 *
 * @param array $items Item rows containing id, title, and slug keys.
 * @return array Collision groups with suggested repaired slugs.
 */
function ogSnippetSlugCollisionRepairMap(array $items): array {
	$slug_groups = array();
	$collisions = array();

	foreach ($items as $item) {
		if (is_array($item) === false) {
			continue;
		}

		if (isset($item['id']) === false || isset($item['slug']) === false) {
			continue;
		}

		$id = (int) $item['id'];
		$title = '';
		$slug = strtolower(trim((string) $item['slug']));

		if (isset($item['title']) === true) {
			$title = trim((string) $item['title']);
		}

		if ($id <= 0 || $slug === '') {
			continue;
		}

		if (isset($slug_groups[$slug]) === false) {
			$slug_groups[$slug] = array();
		}

		$slug_groups[$slug][] = array(
			'id' => $id,
			'title' => $title,
			'slug' => $slug
		);
	}

	foreach ($slug_groups as $slug => $group) {
		if (count($group) < 2) {
			continue;
		}

		$suggestions = array();
		$position = 0;

		foreach ($group as $row) {
			$position++;
			$suggested_slug = $slug;

			if ($position > 1) {
				$suggested_slug = $slug.'-'.$row['id'];
			}

			$suggestions[] = array(
				'id' => $row['id'],
				'title' => $row['title'],
				'current_slug' => $slug,
				'suggested_slug' => $suggested_slug
			);
		}

		$collisions[] = array(
			'slug' => $slug,
			'count' => count($group),
			'suggestions' => $suggestions
		);
	}

	return array(
		'collision_count' => count($collisions),
		'collisions' => $collisions
	);
}

$inventory_rows = array(
	array('id' => 88, 'title' => 'Firefly Cargo Ledger', 'slug' => 'php-cargo-ledger'),
	array('id' => 89, 'title' => 'Serenity Cargo Ledger', 'slug' => 'php-cargo-ledger'),
	array('id' => 90, 'title' => 'Stargate Address Index', 'slug' => 'php-address-index')
);

$slug_repair_map = ogSnippetSlugCollisionRepairMap($inventory_rows);
echo 'Slug collisions found: '.$slug_repair_map['collision_count'];