Oihana PHP

objects

Table of Contents

Functions

compress()  : object
Compress the given object by removing properties that match certain conditions.
ensureObjectPath()  : object
Ensures that a given property of an object is initialized as an object.
hasAllProperties()  : bool
Check if all of the given properties exist in the object.
hasAnyProperty()  : bool
Check if at least one of the given properties exists in the object.
set()  : object
Sets a value in an object using a key path.
setObjectValue()  : object
Sets a value in a flat object using a single property name.
toAssociativeArray()  : array<string|int, mixed>
Recursively converts an object (or array) into a full associative array.

Functions

compress()

Compress the given object by removing properties that match certain conditions.

compress(object $object[, array{conditions?: callable|callable[], depth?: null|int, excludes?: string[], recursive?: bool, removeKeys?: string[], throwable?: bool} $options = [] ][, int $currentDepth = 0 ]) : object

This function traverses the object and removes properties according to the provided options. It can operate recursively on nested objects and arrays.

Parameters
$object : object

The object to compress.

$options : array{conditions?: callable|callable[], depth?: null|int, excludes?: string[], recursive?: bool, removeKeys?: string[], throwable?: bool} = []

Optional configuration.

$currentDepth : int = 0

Internal counter used to track recursion depth.

Tags
throws
InvalidArgumentException

If invalid callbacks are provided and 'throwable' is true.

example

Basic removal of null values

use function oihana\core\objects\compress;

$obj = (object)[
    'id'          => 1,
    'name'        => 'hello',
    'description' => null,
];

$result = compress($obj, [
    'conditions' => fn($v) => $v === null,
]);

// Result: { "id":1, "name":"hello" }
echo json_encode($result);
example

Excluding certain properties

$obj = (object)[
    'id'    => 1,
    'debug' => 'keep me',
    'temp'  => null,
];

$result = compress($obj, [
    'conditions' => fn($v) => $v === null,
    'excludes'   => ['debug'],
]);

// Result: { "id":1, "debug":"keep me" }
echo json_encode($result);
example

Removing properties by name

$obj = (object)[
    'id'    => 1,
    'token' => 'secret',
    'name'  => 'test',
];

$result = compress($obj, [
    'removeKeys' => ['token'],
]);

// Result: { "id":1, "name":"test" }
echo json_encode($result);
example

Recursive compression

$obj = (object)[
    'id'    => 1,
    'child' => (object)[
        'value' => null,
        'label' => 'ok',
    ],
];

$result = compress($obj, [
    'conditions' => fn($v) => $v === null,
    'recursive'  => true,
]);

// Result: { "id":1, "child":{ "label":"ok" } }
echo json_encode($result);
author

Marc Alcaraz

since
1.0.0
Return values
object

The compressed object, with properties removed according to the rules.

ensureObjectPath()

Ensures that a given property of an object is initialized as an object.

& ensureObjectPath(object &$current, string $segment) : object

If the property does not exist or is not an object, it will be replaced with a new stdClass instance. The function returns a reference to the nested object, allowing direct modification.

This is useful when building or navigating nested object structures dynamically.

Parameters
$current : object

The current object in which the property is ensured.

$segment : string

The property name to ensure as an object.

Tags
example
$data = new stdClass();
$ref =& ensureObjectPath($data, 'config');
$ref->enabled = true;
// $data now contains: (object)['config' => (object)['enabled' => true]]
author

Marc Alcaraz (ekameleon)

since
1.0.0
Return values
object

A reference to the ensured nested object (stdClass).

hasAllProperties()

Check if all of the given properties exist in the object.

hasAllProperties(object $object, array<string|int, mixed> $properties[, bool $notNull = false ]) : bool

If $notNull is set to true, each property must also be non-null.

Parameters
$object : object

The object to inspect

$properties : array<string|int, mixed>

List of property names to check

$notNull : bool = false

Whether to check for non-null values (default: false)

Tags
example

Usage

$doc = (object)
[
    'id'     => 123,
    'slogan' => 'Hello'
];

$props = ['id', 'slogan'];

hasAllProperties($doc, $props);        // true
hasAllProperties($doc, $props, true);  // true

$props2 = ['id', 'description'] ;
hasAllProperties($doc, $props2) ; // false (description missing)
author

Marc Alcaraz

since
1.0.0
Return values
bool

True if all properties exist (and are not null if $notNull = true)

hasAnyProperty()

Check if at least one of the given properties exists in the object.

hasAnyProperty(object $object, array<string|int, mixed> $properties[, bool $notNull = false ]) : bool

If $notNull is set to true, the property must also be non-null.

Parameters
$object : object

The object to inspect

$properties : array<string|int, mixed>

List of property names to check

$notNull : bool = false

Whether to check for non-null values (default: false)

Tags
example

Recursive compression

$doc = (object)
[
   'id'     => 123  ,
   'slogan' => null ,
];

$props = [ 'slogan' , 'description' ] ;

hasAnyProperty( $doc , $props ) ; // true  (because 'slogan' exists)
hasAnyProperty( $doc , $props , true ) ; // false (because 'slogan' is null)
author

Marc Alcaraz

since
1.0.0
Return values
bool

True if at least one property exists (and is not null if $notNull = true)

set()

Sets a value in an object using a key path.

set(object $object, string|null $key, mixed $value[, string $separator = '.' ][, bool $copy = false ][, array<string|int, mixed>|string|callable|null $classFactory = null ]) : object

Supports dot notation for nested properties. Intermediate objects are created if needed.

Parameters
$object : object

The object to modify (or copy).

$key : string|null

The key path to set (e.g. 'user.address.country'). If null, replaces entire object.

$value : mixed

The value to set.

$separator : string = '.'

The separator used in the key path. Default is '.'.

$copy : bool = false

If true, returns a deep copy of the object with the modification.

$classFactory : array<string|int, mixed>|string|callable|null = null

A class name, factory callable, or array path => className to create intermediate objects (default: stdClass).

Tags
example
  1. Basic usage with nested keys and default stdClass
$obj = new \stdClass();
$obj = set($obj, 'user.profile.name', 'Alice');
echo $obj->user->profile->name; // Alice
  1. Replace the entire object when key is null
$original = (object)['foo' => 'bar'];
$new = set($original, null, ['x' => 123]);
echo $new->x; // 123
  1. Use a custom class as intermediate objects
class Node { public string $label = ''; }
$obj = set(new Node(), 'tree.branch.leaf', 'green', '.', false, Node::class);
echo $obj->tree->branch->leaf; // green
  1. Use a factory callable
$factory = fn() => new class { public string $value = ''; };
$obj = set(new \stdClass(), 'x.y.z', 99, '.', false, $factory);
echo $obj->x->y->z; // 99
  1. Use an array of path => class mappings
class Address { public string $city = ''; }
class User    { public string $name = ''; }
$obj = new \stdClass();
$obj = set($obj, 'user.address.city', 'Paris', '.', false, [
'user' => User::class,
'user.address' => Address::class,
]);
echo $obj->user->address->city; // Paris
author

Marc Alcaraz (ekameleon)

since
1.0.0
Return values
object

The modified (or copied and modified) object.

setObjectValue()

Sets a value in a flat object using a single property name.

setObjectValue(object $document, string $key, mixed $value) : object

This helper function assigns the given value to the specified property of the provided object. It does not support nested paths or separators.

The object is returned with the updated property.

Parameters
$document : object

The object to modify.

$key : string

The property name to set.

$value : mixed

The value to assign to the property.

Tags
example
$obj = (object)['name' => 'Alice'];
$updated = setObjectValue($obj, 'age', 30);
// $updated = (object)['name' => 'Alice', 'age' => 30];
author

Marc Alcaraz (ekameleon)

since
1.0.0
Return values
object

The modified object with the new or updated property.

toAssociativeArray()

Recursively converts an object (or array) into a full associative array.

toAssociativeArray(array<string|int, mixed>|object $document) : array<string|int, mixed>

This function handles nested objects, ensuring the entire array or object tree is converted.

Note that only public properties of the object will be included in the resulting array.

Parameters
$document : array<string|int, mixed>|object

An array or object to convert to a deep associative array .

Tags
example

Convert an object :

// Define some classes for the example.
class Address
{
    public string $street = '123 PHP Avenue';
    public string $city = 'Codeville';
}

class User
{
    public int $id = 42;
    public string $name = 'John Doe';
    public Address $address;
    private string $sessionToken = 'a-very-secret-token'; // This will be ignored.

    public function __construct()
    {
        $this->address = new Address();
    }
}

$userObject = new User();

$userArray = toAssociativeArray($userObject);

print_r($userArray);
// Output:
// Array
// (
//     [id] => 42
//     [name] => John Doe
//     [address] => Array
//         (
//             [street] => 123 PHP Avenue
//             [city] => Codeville
//         )
// )
// Note that the private property 'sessionToken' is not present.

Convert an array with sub-objects:

$data = (object)
[
    'id' => 123,
    'name' => 'Project Alpha',
    'provider' => (object)
    [
       'name' => 'Alice',
       'role' => 'Chef de projet'
    ],
    'team' =>
     [
        (object) ['name' => 'Bob'     ] ,
        (object) ['name' => 'Charlie' ]
     ]
];

$arrayAssoc = toAssociativeArray($data);

print_r($arrayAssoc);
author

Marc Alcaraz (ekameleon)

since
1.0.0
Return values
array<string|int, mixed>

The resulting associative array.


        
On this page

Search results