Dalej pracujemy nad helperem tablicowym, przy okazji przypominając sobie jak działają tablice. Do dzieła!

Pierwsza metoda – isRecordList, czyli klucze numeryczne, wartości tablicowe:

<?php
class Arr{
    
    //(...)
    public static function isRecordList($array){
        return array_reduce(array_keys($array), function($acc, $k){
            return $acc && is_int($k);
        }, true) && array_reduce($array, function($acc, $v){
            return $acc && is_array($v);
        }, true);
    }
}

No cóż, łatwo nie jest – array_walk w PHP ZAWSZE zwraca true i to jest jedyny sposób, jaki mi do głowy przychodzi, aby sprawdzić, czy coś jest listą rekordów:


//(...)

$records = array(
    array(
        'id' => 2135,
        'first_name' => 'John',
        'last_name' => 'Doe',
    ),
    array(
        'id' => 3245,
        'first_name' => 'Sally',
        'last_name' => 'Smith',
    ),
    array(
        'id' => 5342,
        'first_name' => 'Jane',
        'last_name' => 'Jones',
    ),
    array(
        'id' => 5623,
        'first_name' => 'Peter',
        'last_name' => 'Doe',
    ),
    
);

var_dump(Arr::isRecordList($records));
//true

Następna metoda – isRedordAssoc:

<?php
class Arr{
    
//(...)

public static function isRecordAssoc($array){
        return !array_is_list($array) && array_reduce($array, function($acc, $v){
            return $acc && is_array($v);
        }, true);
    }
}

Użycie:

$records = array(
    array(
        'id' => 2135,
        'first_name' => 'John',
        'last_name' => 'Doe',
    ),
    array(
        'id' => 3245,
        'first_name' => 'Sally',
        'last_name' => 'Smith',
    ),
    array(
        'id' => 5342,
        'first_name' => 'Jane',
        'last_name' => 'Jones',
    ),
    array(
        'id' => 5623,
        'first_name' => 'Peter',
        'last_name' => 'Doe',
    ),
    
);

var_dump(Arr::isRecordAssoc($records));
//false

$recordsAssoc = [
    'h1' => [
        'pattern' => '/\[h1\](.*?)\[\/h1\]/s',
        'replace' => '<h1>$1</h1>',
        'content' => '$1'
    ],
    'h2' => [
        'pattern' => '/\[h2\](.*?)\[\/h2\]/s',
        'replace' => '<h2>$1</h2>',
        'content' => '$1'
    ],
    'h3' => [
        'pattern' => '/\[h3\](.*?)\[\/h3\]/s',
        'replace' => '<h3>$1</h3>',
        'content' => '$1'
    ]
];

var_dump(Arr::isRecordAssoc($recordsAssoc));
//true

Okej, metoda column:

<?php
class Arr{
    
    //(...)

    public static function isRecordList($array){
        return array_reduce(array_keys($array), function($acc, $k){
            return $acc && is_int($k);
        }, true) && array_reduce($array, function($acc, $v){
            return $acc && is_array($v);
        }, true);
    }

    public static function isRecordAssoc($array){
        return !array_is_list($array) && array_reduce($array, function($acc, $v){
            return $acc && is_array($v);
        }, true);
    }

    public static function column($array, $col){
        if(static::isRecordList($array)){
            return array_column($array, $col);
        }
        if(static::isRecordAssoc($array)){
            return array_column(array_values($array), $col);
        }
    }
}

Użycie z listą rekordów:

$records = array(
    array(
        'id' => 2135,
        'first_name' => 'John',
        'last_name' => 'Doe',
    ),
    array(
        'id' => 3245,
        'first_name' => 'Sally',
        'last_name' => 'Smith',
    ),
    array(
        'id' => 5342,
        'first_name' => 'Jane',
        'last_name' => 'Jones',
    ),
    array(
        'id' => 5623,
        'first_name' => 'Peter',
        'last_name' => 'Doe',
    ),
    
);
print_r(Arr::column($records, 'id'));
//Array ( [0] => 2135 [1] => 3245 [2] => 5342 [3] => 5623 )

Użycie z asocjacyjną tablicą rekordów:

$recordsAssoc = [
    'h1' => [
        'pattern' => '/\[h1\](.*?)\[\/h1\]/s',
        'replace' => '<h1>$1</h1>',
        'content' => '$1'
    ],
    'h2' => [
        'pattern' => '/\[h2\](.*?)\[\/h2\]/s',
        'replace' => '<h2>$1</h2>',
        'content' => '$1'
    ],
    'h3' => [
        'pattern' => '/\[h3\](.*?)\[\/h3\]/s',
        'replace' => '<h3>$1</h3>',
        'content' => '$1'
    ]
];
print_r(Arr::column($recordsAssoc, 'content'));
//Array ( [0] => $1 [1] => $1 [2] => $1 )

Jeżeli rozumiemy to wszystko, to już całkiem nieźle ogarniamy jak działają tablice. Temat będzie kontunuowany.