От одного из наших поставщиков я получил DVD с изображениями 12K +. Прежде чем я разместил их на нашем веб-сервере, мне нужно изменить размер, переименовать и скопировать их. Для этого я пишу программу PHP cli. И кажется, что я немного застрял с этим ...Манипулировать массивными массивами строк
Все файлы подходят для определенного шаблона.
Копирование и переименование не являются проблемой, манипуляции с строками.
Итак, чтобы скомпоновать пример кода: давайте предположим, что у меня есть массив со строками, и я хочу поместить их в новый массив.
Исходный массив выглядит следующим образом:
$names = array (
'FIX1_VARA_000.1111_FIX2',
'FIX1_VARB_000.1111.2_FIX2',
'FIX1_VARB_222.2582_FIX2',
'FIX1_VARC_555.8794_FIX2',
'FIX1_VARD_111.0X00(2-5)_FIX2',
'FIX1_VARA_112.01XX(09-13)_FIX2',
'FIX1_VARB_444.XXX1(203-207).2_FIX2'
);
Каждая строка в массиве начинается с одной и той же фиксированной части в передней части и заканчивается одной и той же фиксированной части в конце FIX1 & fix2 соответственно. После FIX1 всегда есть символ подчеркивания, за которым следует переменная часть, а затем символ подчеркивания. Меня не интересуют неподвижные детали или переменные детали. Поэтому я все это отрезал.
Оставшаяся строка может быть двух типов: Если она содержит только числа и точки: тогда это допустимая строка, и я положил ее в массив $ clean. EG: 000.1111 или 000.111.2 Если строка содержит не только числа и точки в ней, она всегда имеет несколько X в ней и открытую закрытую, заключенную с цифрами, и a. Как 444.XXX1 (203-207) .2
Номера между скобками образуют серию, и каждое число в этой серии должно заменить X. Строки, которые должны быть помещены в $ чистого массива:
444.2031.2
444.2041.2
444.2051.2
444.2061.2
444.2071.2
Это та часть, с которой я борюсь.
$clean = array();
foreach ($names as $name){
$item = trim(strstr(str_replace(array('FIX1_', '_FIX2'),'',$name), '_'),'_');
// $item get the values:
/*
* 000.1111,
* 000.1111.2,
* 222.2582,
* 555.8794,
* 111.0X00(2-5),
* 112.01XX(09-13),
* 444.XXX1(203-207).2
*
*/
// IF an item has no X in it, it can be put in the $clean array
if (strpos($item,'X') === false){
//this is true for the first 4 array values in the example
$clean[] = $item;
}
else {
//this is for the last 3 array values in the example
$b = strpos($item,'(');
$e = strpos($item,')');
$sequence = substr($item,$b,$e-$b+1);
$item = str_replace($sequence,'',$item);
/* This is the part were I'm stuck */
/* ------------------------------- */
/* it should get the values in the sequence variable and iterate over them:
*
* So for $names[5] ('FIX1_VARA_112.01XX(09-13)_FIX2') I want the folowing values entered into the $clean array:
* Value of $sequence = '(09-13)'
*
* 112.0109
* 112.0110
* 112.0111
* 112.0112
* 112.0113
*
*/
}
}
//NOW ECHO ALL VALUES IN $clean:
foreach ($clean as $c){
echo $c . "\n";
}
Конечный результат должен быть:
000.1111
000.1111.2
222.2582
555.8794
111.0200
111.0300
111.0400
111.0500
112.0109
112.0110
112.0111
112.0112
112.0113
444.2031.2
444.2041.2
444.2051.2
444.2061.2
444.2071.2
Любая помощь с «Вот я застрял» часть будет весьма признателен.
12k не массивный. Кстати, есть сотни готовых к использованию классов ... –
Будьте осторожны с 'strpos ($ item, 'X') == false', вы должны использовать' === ', в противном случае позиция' 0' будет считаться 'false', так как' 0 == false' – Random
Вы можете просто разбить строки на массив, используя '_' в качестве разделителя и взять третью часть – frz3993