Intereting Posts

PHP – упростить способ обработки массивов

При работе с массивами я вынужден добавить кучу повторяющегося кода для обработки массивов с одним дочерним и несколькими:

//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 ().