2014-09-16 3 views
0

Я новичок в PHP, поэтому я не уверен, как оптимизировать этот код.PHP: лучший способ заменить строковое значение в массиве массивом?

Я выполняю скрипт Python от PHP, а возвращаемая переменная $output - это массив массивов.

exec (" /Users/$USER/anaconda/bin/python /Applications/MAMP/cgi-bin/Evaluation1.py",$output) 

Каждый массив в пределах $output массива содержит одно значение строки через запятую. Таким образом, $output является массивом ([0] => 1, 好, 0 [1] => 2, 妈妈, 3) и т. Д.

В каждом массиве в массиве $output я использую explode для строкового значения для создания массив, и добавить его в мой новый $output массив под названием $output2

$output2 = array(); 
foreach($output as $value){ 
$myArray = explode(',', $value); 
$output2[] = $myArray; 
} 

есть ли способ, чтобы просто заменить/перезаписать значение строки в массивах в $output с новым массивом, вместо добавления каждого элемента на новый $output2 массив?

ответ

2

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

Тестовые данные:

$output = array(
    '1,A,2', 
    '2,B,3', 
    '3,C,4' 
); 

РНР> = 5.3.0

array_walk($output, function(&$val){ $val = explode(',', $val); }); 

Старые РНР

function mySplit(&$val){ 
    $val = explode(',', $val); 
} 
array_walk($output, 'mySplit'); 

И выход:

Array 
(
    [0] => Array 
     (
      [0] => 1 
      [1] => A 
      [2] => 2 
     ) 

    [1] => Array 
     (
      [0] => 2 
      [1] => B 
      [2] => 3 
     ) 

    [2] => Array 
     (
      [0] => 3 
      [1] => C 
      [2] => 4 
     ) 

) 
1

Уже есть отличные ответы. Просто добавьте это для полноты.

$ar = array(
    "1,2,3", 
    "4,5,6" 
); 

foreach($ar as $k => $v) { 
    $ar[$k] = explode(',', $v); 
} 

Wold быть интересным, чтобы увидеть разницу в производительности различных методов, хотя я сомневаюсь, что это будет много.

+2

Мне действительно было интересно узнать о тестах, поэтому я написал/проверил небольшое испытание. Более 1000 итераций, [мой код с анонимной функцией:] (http://codepad.viper-7.com/35NZZ1) '32.21ms', [мой код с определенной функцией:] (http: //codepad.viper-7 .com/gUiNZe) '27.76ms', [ваш код:] (http://codepad.viper-7.com/rb6zjj)' 21.27ms', [код derp:] (http: //codepad.viper-7 .com/tegghB) '28.17ms'. Вы можете щелкнуть по ссылкам, чтобы увидеть каждый тест. В то время как все они близки друг к другу, и разница незначительна, я думаю, что интересно, что функция анонов предлагает немного накладных расходов с вашей победой foreach. –

+0

@ JonathanKuhn потрясающий! спасибо за выполнение тестов. – mschuett

Смежные вопросы