Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737
Форумы портала PHP.SU :: прибавление значения к каждому значению массива в зависимости от количества элементов в массиве

 PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


 Страниц (2): [1] 2 »   

> Без описания
ridvik
Отправлено: 24 Июля, 2014 - 15:32:19
Post Id


Частый гость


Покинул форум
Сообщений всего: 244
Дата рег-ции: Нояб. 2011  


Помог: 0 раз(а)

[+]


Добрый вечер. Подскажите пожалуйста как решить данную проблему.
Есть массив получаемый таким образом:
PHP:
скопировать код в буфер обмена
  1. $string = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ';
  2. $arr1 = str_split($string);

Получается что в массиве 26 значений. Этими значениями формируется другой массив, с которым как раз у меня проблемы. Как сделать так, чтобы если значений > 26 то сначала получалось АА, AB, AC и тд. Если доходит до AZ, а элементов больше, то подставляется уже BA, BB, BC и тд. Как мне это сделать?

(Отредактировано автором: 24 Июля, 2014 - 15:33:34)

 
 Top
armancho7777777 Супермодератор
Отправлено: 25 Июля, 2014 - 01:02:19
Post Id



Активный участник


Покинул форум
Сообщений всего: 4526
Дата рег-ции: Февр. 2011  
Откуда: Москва


Помог: 221 раз(а)




PHP:
скопировать код в буфер обмена
  1. $string = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ';
  2. $arr1 = str_split($string);
  3. $arr2 = $arr1;
  4. $prefix = '';
  5.  
  6. $data = range(1, 1000);
  7.  
  8. foreach($data as $i => $val)
  9. {
  10.     if(is_null(key($arr1)))
  11.     {
  12.         reset($arr1);
  13.  
  14.         if(is_null(key($arr2))) {
  15.             reset($arr2);
  16.         }
  17.  
  18.         $prefix .= current($arr2);
  19.         next($arr2);
  20.     }
  21.  
  22.     $char = current($arr1);
  23.     $data[$i] = $prefix . $char . ') ' . $val;
  24.     next($arr1);
  25. }


Результат (Отобразить)

(Добавление)
ridvik пишет:
уже BA

Это же задом на перёд выйдет.
Если именно так надо, замените 18-ую строку моего кода на

(Отредактировано автором: 25 Июля, 2014 - 01:09:40)

 
 Top
DelphinPRO
Отправлено: 25 Июля, 2014 - 01:53:24
Post Id



Активный участник


Покинул форум
Сообщений всего: 7187
Дата рег-ции: Февр. 2012  


Помог: 353 раз(а)




armancho7777777 мне кажется, имелась ввиду 26-ричная система счисления

CODE (text):
скопировать код в буфер обмена
  1. AA .. AZ
  2. BA .. BZ
  3. ...
  4. ZA .. ZZ

(Добавление)
нечто вроде

PHP:
скопировать код в буфер обмена
  1. $string = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ';
  2. $arr1 = str_split($string);
  3.  
  4. $result = array();
  5. foreach ($arr1 as $d1) {
  6.         foreach ($arr1 as $d2) {
  7.                 $result[] = $d1 . $d2;
  8.         }
  9. }
  10. print_r($result);


-----
Чем больше узнаю, тем больше я не знаю.
 
 Top
IllusionMH
Отправлено: 25 Июля, 2014 - 02:42:24
Post Id



Активный участник


Покинул форум
Сообщений всего: 4254
Дата рег-ции: Февр. 2011  
Откуда: .kh.ua


Помог: 242 раз(а)




del.

(Отредактировано автором: 25 Июля, 2014 - 02:52:14)

 
 Top
armancho7777777 Супермодератор
Отправлено: 25 Июля, 2014 - 03:16:37
Post Id



Активный участник


Покинул форум
Сообщений всего: 4526
Дата рег-ции: Февр. 2011  
Откуда: Москва


Помог: 221 раз(а)




DelphinPRO пишет:
мне кажется, имелась ввиду 26-ричная система счисления

Нет.
 
 Top
IllusionMH
Отправлено: 25 Июля, 2014 - 03:32:22
Post Id



Активный участник


Покинул форум
Сообщений всего: 4254
Дата рег-ции: Февр. 2011  
Откуда: .kh.ua


Помог: 242 раз(а)




DelphinPRO, ну не совсем 26-ричная, хотя и близко.
Т.к. после смены "порядка" происходит сдвиг значения символа. У ТСа все начинается с одного символа.
Вот накодил пока не спиться http://codepad[dot]viper-7[dot]com/Jb4R13 . Вроде совпадает с названиями колонок в Excel (дума ТС имел это ввиду)

P.S. Под сдвигом подразумеваю то, что в 28=>AB A играет роль "единицы" следующего порядка. А в 27=>AA первая A - "единица", а вот вторая - "ноль". Т.к. это на единицу больше чем максимальное значение в одном порядке порядке Z

(Отредактировано автором: 25 Июля, 2014 - 03:40:36)

 
 Top
armancho7777777 Супермодератор
Отправлено: 25 Июля, 2014 - 03:33:43
Post Id



Активный участник


Покинул форум
Сообщений всего: 4526
Дата рег-ции: Февр. 2011  
Откуда: Москва


Помог: 221 раз(а)




DelphinPRO пишет:
нечто вроде

ridvik пишет:
Если доходит до AZ, а элементов больше, то подставляется уже BA, BB, BC и тд.
 
 Top
ridvik
Отправлено: 25 Июля, 2014 - 08:47:20
Post Id


Частый гость


Покинул форум
Сообщений всего: 244
Дата рег-ции: Нояб. 2011  


Помог: 0 раз(а)

[+]


IllusionMH пишет:
DelphinPRO, ну не совсем 26-ричная, хотя и близко.
Т.к. после смены "порядка" происходит сдвиг значения символа. У ТСа все начинается с одного символа.
Вот накодил пока не спиться http://codepad[dot]viper-7[dot]com/Jb4R13 . Вроде совпадает с названиями колонок в Excel (дума ТС имел это ввиду)

P.S. Под сдвигом подразумеваю то, что в 28=>AB A играет роль "единицы" следующего порядка. А в 27=>AA первая A - "единица", а вот вторая - "ноль". Т.к. это на единицу больше чем максимальное значение в одном порядке порядке Z


доделал ваш пример до вот такого вида:
PHP:
скопировать код в буфер обмена
  1. $alph = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ';
  2.  
  3.                 //$num = 2;
  4.                
  5.                 //$count = 677;
  6.                 //$count = rand(1, 10000);
  7.                
  8.                 $array = array();
  9.                 for ($i=1;$i<$count+1;$i++) {
  10.                         $res = '';
  11.                         $num = floor($i);
  12.                         while($num > 0) {
  13.                                 $res = substr($alph, ($num % strlen($alph)-1), 1) . $res;
  14.                                 if(1 === strlen($res)) {
  15.                                         $num--;
  16.                                 }
  17.                                 $num = floor($num / strlen($alph));
  18.                                 $alph = trim($alph);
  19.                         }
  20.                         $array[$i] = $res;
  21.                 }

Спойлер (Отобразить)

Если обратить внимание на элемент 677 то видно, что на его месте должен быть элемент ZA, а тут получилось AZA. Как это поправить?)
 
 Top
Ch_chov
Отправлено: 25 Июля, 2014 - 09:16:35
Post Id



Постоянный участник


Покинул форум
Сообщений всего: 2121
Дата рег-ции: Июль 2008  
Откуда: из города


Помог: 90 раз(а)




IllusionMH пишет:
Вот накодил пока не спиться http://codepad[dot]viper-7[dot]com/Jb4R13


Можно упростить http://codepad[dot]viper-7[dot]com/opOC1G
 
 Top
Sail
Отправлено: 25 Июля, 2014 - 09:57:25
Post Id



Участник


Покинул форум
Сообщений всего: 1131
Дата рег-ции: Февр. 2014  


Помог: 57 раз(а)




Вот другой велосипед:
PHP:
скопировать код в буфер обмена
  1. //        $string = 'ABC';
  2. //        $nDict = 3;
  3.         $string = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ';
  4.         $nDict = 26;
  5.         $arr1 = str_split($string);
  6.         $NNN = 1024;
  7.         for($i = 1; $i <= $NNN; $i++) {
  8.             $aSt = array();
  9.             $aSt[] = ($i-1)%$nDict;
  10.             $N = (int)(($i-1)/$nDict);
  11.             while ($N > $nDict) {
  12.                 $aSt[] = ($N-1)%$nDict;
  13.                 $N = (int)(($N-1) / $nDict);
  14.             }
  15.             if($N != 0) {
  16.                 $aSt[] = $N - 1;
  17.             }
  18.             echo $i.': ';
  19.             while(!empty($aSt)) {
  20.                 echo $arr1[array_pop($aSt)];
  21.             }
  22.             echo '<br>';
  23.         }
  24.  

$nDict - "длина словаря" (количество символов в строке).
$string - "словарь".

(Отредактировано автором: 25 Июля, 2014 - 10:20:40)

 
 Top
ridvik
Отправлено: 25 Июля, 2014 - 10:09:23
Post Id


Частый гость


Покинул форум
Сообщений всего: 244
Дата рег-ции: Нояб. 2011  


Помог: 0 раз(а)

[+]


Вот как у меня в данный момент))) Склеил несколько примеров)) вроде то что нужно)) Проверьте пожалуйста))
CODE (htmlphp):
скопировать код в буфер обмена
  1. public function groups() {
  2.                 //$data['content'] = $this->parser->parse("test/regular.tpl", $datas, TRUE);
  3.                 $alph = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ';
  4.  
  5.                 //$num = 2;
  6.                
  7.                 $count = 800;
  8.                 //$count = rand(1, 10000);
  9.                
  10.                 $array = array();
  11.                 for ($i=703;$i<$count+1;$i++) {
  12.                         $res = '';
  13.                         $num = floor($i);
  14.                         while($num > 0) {
  15.                                 $res = substr($alph, ($num % strlen($alph)-1), 1) . $res;
  16.                                 if(1 === strlen($res)) {
  17.                                         $num--;
  18.                                 }
  19.                                 $num = floor($num / strlen($alph));
  20.                                 $alph = trim($alph);
  21.                         }
  22.                         $array[$i] = $res;
  23.                 }
  24.  
  25.                 $string = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ';
  26.                 $arr1 = str_split($string);
  27.                  
  28.                 $result = array();
  29.                 foreach ($arr1 as $d1) {
  30.                                 foreach ($arr1 as $d2) {
  31.                                                 $result[] = $d1 . $d2;
  32.                                 }
  33.                 }
  34.                
  35.                 $result = array_merge($arr1, $result);
  36.                 $result = array_merge($result, $array);
  37.                 //echo "<pre>";
  38.                         //print_r($arr1);
  39.                         //print_r($result);
  40.                 //echo "</pre>";
  41.                 //echo count($arr1);
  42.                 //$this->smarty->assign('items', $result);
  43.                 $data['content'] = $this->parser->parse('test/groups.tpl', '', TRUE);
  44.                 $this->parser->parse("index.tpl", $data);
  45.         }

Ch_chov, мне цикл нужен, а не определённый элемент)
 
 Top
Panoptik
Отправлено: 25 Июля, 2014 - 10:10:39
Post Id



Постоянный участник


Покинул форум
Сообщений всего: 2493
Дата рег-ции: Нояб. 2011  
Откуда: Одесса, Украина


Помог: 131 раз(а)




я когда работал с выводом в эксель писал такой хелпер

PHP:
скопировать код в буфер обмена
  1. function getColumnName($i) {
  2.         return ($i > 26)?
  3.             chr(64 + ceil($i/26)).chr(64 + $i%26):
  4.             chr(64 + $i%26);
  5.      }
  6.  


-----
Just do it
 
 Top
DelphinPRO
Отправлено: 25 Июля, 2014 - 10:52:48
Post Id



Активный участник


Покинул форум
Сообщений всего: 7187
Дата рег-ции: Февр. 2012  


Помог: 353 раз(а)




сколько кода...

добавим одиночные символы в начало к моему примеру и готово.

PHP:
скопировать код в буфер обмена
  1. $string = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ';
  2. $arr1 = str_split($string);
  3.  
  4. $result = array();
  5. foreach ($arr1 as $d) $result[] = $d;
  6. foreach ($arr1 as $d1) {
  7.         foreach ($arr1 as $d2) {
  8.                 $result[] = $d1 . $d2;
  9.         }
  10. }
  11. print_r($result);


-----
Чем больше узнаю, тем больше я не знаю.
 
 Top
Sail
Отправлено: 25 Июля, 2014 - 11:12:49
Post Id



Участник


Покинул форум
Сообщений всего: 1131
Дата рег-ции: Февр. 2014  


Помог: 57 раз(а)




DelphinPRO пишет:
добавим одиночные символы в начало к моему примеру и готово.

А ведь предел "количества значений" ТС не ограничивал... Закатив глазки
 
 Top
DelphinPRO
Отправлено: 25 Июля, 2014 - 11:16:25
Post Id



Активный участник


Покинул форум
Сообщений всего: 7187
Дата рег-ции: Февр. 2012  


Помог: 353 раз(а)




ну тогда да, мой вариант не подойдет Недовольство, огорчение


-----
Чем больше узнаю, тем больше я не знаю.
 
 Top
Страниц (2): [1] 2 »
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« Вопросы новичков »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB