Extracting Sequential Data with Laravel's takeWhile
Last updated on by Harris Raftopoulos
Laravel's takeWhile method provides precise control over collection filtering, allowing you to extract elements that consecutively meet a condition until the first failure occurs.
$numbers = collect([1, 2, 3, 4, 2, 1]); $ascending = $numbers->takeWhile(function ($number, $key) use ($numbers) { if ($key === 0) return true; return $number > $numbers[$key - 1];});// Result: [1, 2, 3, 4]
Let's explore a practical example of managing an order processing system with status tracking:
<?php namespace App\Services; use App\Models\Order;use App\Models\OrderStatus;use Illuminate\Support\Collection; class OrderProcessingService{ public function getSuccessfulSteps(Order $order): Collection { return $order->statusUpdates() ->oldest() ->get() ->takeWhile(function (OrderStatus $status) { return $status->successful; }) ->map(function (OrderStatus $status) { return [ 'step' => $status->step_name, 'completed_at' => $status->created_at->format('Y-m-d H:i:s'), 'processor' => $status->processor_name ]; }); } public function validateProcessingSequence(Collection $steps): bool { $requiredOrder = ['payment', 'inventory', 'packaging', 'shipping']; $currentStep = 0; return $steps->takeWhile(function ($step) use ($requiredOrder, &$currentStep) { return $step['type'] === $requiredOrder[$currentStep++] ?? null; })->count() === count($requiredOrder); }}
TakeWhile offers a powerful way to work with sequential data, perfect for processing status updates, validating sequences, or analyzing trends in your data.