Skip to content
← Back to Functions
Code

A/B Test Result Summarizer

Computes variant counts, conversion rates, lift, and simple confidence flags.

Function signature

ogSummarizeAbTestResults(variants = array(), options = array())

Categories

  • Developer Utilities

Parameters

variantsVariant rows with name, visitors, and conversions keys.optionsOptions: baseline variant name. Recognized keys: `baseline`.

Return value

Short public-safe status message.

  • variants
  • certainty_note

Compatibility

Existing function name and call order preserved; metadata signature corrected to source.

Minimum PHP version: 7.4

Security notes

Validate request method, identity, permissions, policy arrays, URLs, signatures, and caller-owned allowlists before use; keep secrets and internal paths out of public output.

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.
 */

/**
 * Summarizes A/B test variants with conversion rate and lift against baseline.
 *
 * The helper reports simple directional metrics only. It does not claim
 * statistical certainty or replace a full experimentation engine.
 *
 * @param array $variants Variant rows with name, visitors, and conversions keys.
 * @param array $options Options: baseline variant name.
 * @return array A/B test summary.
 */
function ogSummarizeAbTestResults($variants = array(), $options = array()) {
	$result = array(
		'success' => false,
		'message' => '',
		'data' => array()
	);

	if (!is_array($variants)) {
		$result['message'] = 'Variants must be an array.';
		return $result;
	}

	if (!is_array($options)) {
		$options = array();
	}

	$summary = array();
	$baseline_name = '';
	if (!empty($options['baseline'])) {
		$baseline_name = (string)$options['baseline'];
	}

	$baseline_rate = null;
	foreach ($variants as $variant) {
		if (!is_array($variant)) {
			continue;
		}

		$name = 'variant-' . (count($summary) + 1);
		if (!empty($variant['name'])) {
			$name = (string)$variant['name'];
		}
		$visitors = 0;
		if (!empty($variant['visitors'])) {
			$visitors = (int)$variant['visitors'];
		}
		$conversions = 0;
		if (!empty($variant['conversions'])) {
			$conversions = (int)$variant['conversions'];
		}

		$rate = 0;
		if ($visitors > 0) {
			$rate = ($conversions / $visitors) * 100;
		}

		if ($baseline_rate === null) {
			$baseline_rate = $rate;
			if (empty($baseline_name)) {
				$baseline_name = $name;
			}
		}
		if ($name == $baseline_name) {
			$baseline_rate = $rate;
		}

		$summary[$name] = array(
			'visitors' => $visitors,
			'conversions' => $conversions,
			'conversion_rate_percent' => $rate,
			'lift_percent' => 0
		);
	}

	foreach ($summary as $name => $row) {
		$lift = 0;
		if ($baseline_rate !== null && $baseline_rate != 0) {
			$lift = (($row['conversion_rate_percent'] - $baseline_rate) / abs($baseline_rate)) * 100;
		}
		$summary[$name]['lift_percent'] = $lift;
		$summary[$name]['is_baseline'] = ($name == $baseline_name);
	}

	$result['success'] = true;
	$result['message'] = 'A/B test summary built.';
	$result['data'] = array(
		'baseline' => $baseline_name,
		'variants' => $summary,
		'certainty_note' => 'Directional summary only; no statistical certainty is claimed.'
	);

	return $result;
}