arrays — обратный вызов после завершения array_walk

Я пытаюсь запустить функцию для каждого элемента в массиве, используя array_walk и попытаться поймать, чтобы я мог сказать, если какие-либо элементы не прошли через функцию успешно.

После того, как все элементы прошли через функцию, мне нужно ответить полным обратным вызовом.

В моем коде ниже, хотя complete json_ecnode запускается каждый раз, а не в самом конце. Что я делаю неправильно? И это самый эффективный способ сделать это?

$products = array('shirt','skirt','jumper','lingerie','makeup','top','trousers','coats');

$i = 0;
function createProducts(&$item, $key){
try {
// try something
}
catch(Exception $e) {
// error
}
$i++;
if($i > count($products)) { json_encode('complete'); }
}

array_walk($products, 'createProducts');

1

Решение

Ну, вы могли бы сделать что-то вроде этого:

$products = array('shirt','skirt','jumper','lingerie','makeup','top','trousers','coats');
$count = count($products);
$i = 0;
array_walk($products, function(&$item, $key) use (&$i, $count){ // using anonymous
try {
// try something
echo "<strong>$item</strong><br/>";
}
catch(Exception $e) {
// error
}

$i++;
if($i == $count) {

echo 'completed at ' . $i;
// execute something
}
});
1

Другие решения

$i всегда будет 1, потому что каждый раз, когда вы выполняете функцию, вы получаете новый экземпляр этой переменной.

0

В дополнение к ответу Ghost, здесь есть способ сделать это с помощью анонимного вызова, но вы по-прежнему определяете функцию ранее, а не правильно, когда используете ее. (Что будет лучше, если вы намереваетесь использовать его позже)

$products = array('shirt','skirt','jumper','lingerie','makeup','top','trousers','coats');

$i = 0;
$callback = function (&$item, $key) use ($i) {
try {
// try something
}
catch(Exception $e) {
// error
}
$i++;
if($i > count($products)) { json_encode('complete'); }
};

array_walk($products, $callback);
0
По вопросам рекламы [email protected]