При работе с массивами я вынужден добавить кучу повторяющегося кода для обработки массивов с одним дочерним и несколькими:
//If more than one step, process each step, elcse processs single if(!array_key_exists('command',$pullcase['steps']['step'])) { foreach($pullcase['steps']['step'] as $step) { $command=$step['command']; $parameter=$step['parameter']; if(isset($step['value'])){ $value = $step['value']; $this->runCommands($command,$parameter,$value); } else { $this->runCommands($command,$parameter); } } } else { $command = $pullcase['steps']['step']['command']; $parameter = $pullcase['steps']['step']['parameter']; if(isset($pullcase['steps']['step']['value'])){ $value = $pullcase['steps']['step']['value']; $this->runCommands($command,$parameter,$value); } else { $this->runCommands($command,$parameter); } }
Как вы можете видеть, мне приходится дублировать свои усилия в зависимости от того, существует ли один элемент в массиве против нескольких:
$pullcase['steps']['step'][0]['command']
против
$pullcase['steps']['step']['command']
Как я могу упростить этот код, чтобы я мог использовать одну переменную для всех экземпляров?
Если вы управляете созданием массива, сделайте step
массивом из одного, даже если есть только один, поэтому у вас всегда есть массив. Это возможно?
У вас либо есть массив step
[step][0][command]
либо у вас есть один шаг [step][command]
. Поэтому, когда вы создаете массив вместо [step][command]
сделайте [step][0][command]
и т. Д. Стандартный способ сделать это, проблема решена, поскольку вам нужен только foreach
.
Если вы не можете сделать это при создании массива, подумайте о том, чтобы сделать это перед циклом:
if(is_array($pullcase['steps']['step'])) { $steps = $pullcase['steps']['step']; } else { $steps[] = $pullcase['steps']['step']; } foreach($steps as $step) { $value = isset($step['value']) ? $step['value'] : null; $this->runCommands($step['command'], $step['parameter'], $value); }
Кроме того, если runCommands()
может обнаружить пустой аргумент, то альтернатива if/else
для вызова функции используется выше.
Может помочь следующее. Это не делает много, но вызывает функцию «runcommands» на значение, если ключ является «командой». Я использую его, чтобы показать, как вы можете использовать array_walk_recursive, чтобы решить вашу проблему.
Во-первых, вам нужна функция:
function runcommandswhencommand($value, $key) { if($key == 'command') runcommands($value); }
Теперь вы можете использовать рекурсивную прогулку по вашему массиву:
array_walk_recursive($pullcase, 'runcommandswhencommand');
При этом всякий раз, когда ключ является «командой», значение этого индекса будет использоваться в параметре функции runcommands ().