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'];