$a = [
1 => [
3 => [
"logo" => "logo_3_1",
"cover" => "cover_3_1"
],
4 => [
"logo" => "logo_4_1",
]
],
2 => [
5 => [
"logo" => "logo_5_2",
"cover" => "cover_5_2"
]
]
];
$r = [];
$ai = new RecursiveArrayIterator($a);
$ari = new RecursiveIteratorIterator($ai);
foreach ($ari as $key => $value) {
array_push($r, $value);
}
function simpleIterator($iterator, $result)
{
while ($iterator->valid()) {
if ($iterator->hasChildren()) {
simpleIterator($iterator->getChildren(), $result);
}
else {
if ($result[$iterator->current()]) {
$iterator->offsetSet($iterator->key(), $result[$iterator->current()]);
};
}
$iterator->next();
}
};
iterator_apply($ai, 'simpleIterator', [$ai, $images]);
Нужно пройтись по этому массиву и выбрать эти идентификаторы. Потому на основании их будет сделана выборка и мы получим пути к изображениям.
P.S. Там справа ещё пачка функий на эту же тему.
array_walk_recursive то самое.
"не числовые индексы" сами по себе не обязательны.Ещё раз, посмотрел внимательнее, у Вас в значениях может быть либо массив, либо "не массив", соотв., если это не массив, значит, это то самое значение, которое нам нужно. В принципе, его можно и получать, и изменять...
function arrayGetIterator($element, $key, $ids)
{
$ids[] = $element;
}
$ids = [];
array_walk_recursive($a, "arrayGetIterator", $ids);
echo "<pre>";
print_r($ids);
echo "</pre>";
Если требуется, чтобы функция callback изменила значения в массиве, определите первый параметр callback как ссылку. Тогда все изменения будут применены к элементам массива.(с) Оригинал
Если требуется, чтобы функция callback изменила значения в массиве, определите первый параметр callback как ссылку. Тогда все изменения будут применены к элементам массива.Это я как раз и использую для изменения, а вот получить значения не получается.
//Изменить
array_walk_recursive($a, function(&$b) {
$b = rand(1, 1000);
});
//Получить
array_walk_recursive($a, function(&$b) {
var_dump($b);
});
array_walk_recursive($a, function(&$b) {
var_dump($b);
});
array_walk_recursive($a, function(&$b) {
$b = rand(1, 1000);
});
Как это присвоить переменной вне массива.
$c = 1;
array_walk_recursive($a, function($b) use (&$c) {
$c = $b;
});
var_dump($c);
Как-то так, как вариант... function bla($value, $key, &$ids)
{
$ids[] = $value;
}
array_walk_recursive($a, "bla", $ids);
так можно array_walk в эту функцию засунуть... или я опять что-то упустил? :)
function bla(&$value, $key, $logos)
{
if (array_key_exists($value, $logos)) {
$value = $logos[$value];
};
}
array_walk_recursive($a, "bla", $logos);
$ids = [];
function bla($value, $key, &$ids)
{
$ids[] = $value;
}
array_walk_recursive($a, "bla", $ids);
function bla($value, $key, &$ids)
- array_walk_recursive: Typically, funcname takes on two parameters. The input parameter's value being the first, and the key/index second.
bool array_walk_recursive ( array &$array , callable $callback [, mixed $userdata = NULL ] )
Если указан необязательный параметр userdata, то он будет передан третьим параметром функции callback.
<?php
$a = [
1 => [
3 => [
"logo" => "logo_3_1",
"cover" => "cover_3_1"
],
4 => [
"logo" => "logo_4_1",
]
],
2 => [
5 => [
"logo" => "logo_5_2",
"cover" => "cover_5_2"
]
]
];
class A
{
public function bla($array)
{
$ids = [];
array_walk_recursive($array, function($value, $key) use (&$ids, $array) {
$ids[] = $value;
});
return $ids;
}
}
$class = new A();
var_dump($class->bla($a));
array_walk_recursive($a, "bla" use (&$ids), $ids);
дык это ж не та функция, в которую можно 3-й параметр передавать. Это 3-й параметр для array_walk_recursive(), а я говорю про callback-функцию, у нее всего 2 параметра. В примере выше - это функция bla() - у нее может быть 2 параметра, у array_walk_recursive() - 3.
function bla(&$value, $key, $logos)
{
if (array_key_exists($value, $logos)) {
$value = $logos[$value];
};
}
array_walk_recursive($a, "bla", $logos);
class A
{
public function bla($array)
{
$ids = [];
array_walk_recursive($array, function($value, $key) use (&$ids, $array) {
$ids[] = $value;
});
return $ids;
}
}
$class = new A();
var_dump($class->bla($a));
array_walk_recursive($a, "bla" use (&$logos));
<?php
$a = [
1 => [
3 => [
'logo' => 'logo_3_1',
'cover' => 'cover_3_1',
],
4 => [
]
],
2 => [
5 => [
'logo' => 'logo_5_2',
'cover' => 'cover_5_2',
]
]
];
$logos = [
'logo_3_1' => 'L31',
'logo_4_1' => 'L41',
];
array_walk_recursive($a, function (&$item, $key) use ($logos) {
if (in_array($key, ['logo', 'cover'])) {
if (array_key_exists($item, $logos)) {
$item = $logos[$item];
}
}
});
echo '<pre>';
var_dump($a);
echo '</pre>';
$logos = [
"logo_3_1" => "L31",
"logo_4_1" => "L41",
];
function simpleIterator(&$iterator, $logos)
{
while ($iterator->valid()) {
if ($iterator->hasChildren()) {
simpleIterator($iterator->getChildren(), $logos);
}
else {
if ($logos[$iterator->current()]) {
$iterator->offsetSet($iterator->key(), $logos[$iterator->current()]);
};
}
$iterator->next();
}
};
$ai = new RecursiveArrayIterator($a);
$ari = new RecursiveIteratorIterator($ai);
iterator_apply($ai, 'simpleIterator', [$ai, $logos]);
$ai = new RecursiveArrayIterator(&$a);