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.