Usamos cookies para medir audiência e melhorar sua experiência. Você pode aceitar ou recusar a qualquer momento. Veja sobre o iMasters.
Galera tenho um script aqui, que pega os tamanhos disponíveis dos produtos.
Funciona da seguinte forma: o cliente cadastra as informações do prod. e coloca os tamanhos disponivies do mesmo de X a Y, exemplo(tamanho 34 a 40).
só que no caso preciso colocar os tamanhos indisponiveis entre X e Y, exemplo(de 34 a 40, menos os numeros 36 e 38).
então estou fazendo dessa forma:
/**
* Faz um range ( entre ( de tamanho ) até ( a tamanho ) menos os números 'x,y,z...' )
*/
function available( array $arr , $unavailable ) {
return array_diff( $arr , explode( ',' , $unavailable ) );
}
$numeros = ( available(range( $dados[ 'detamanho' ] , $dados[ 'atamanho' ] ), '32,36' ) );
echo '<td class="input">';
/**
* Mostra os tamanhos disponíveis
* o nome do input hidden já é o recuperado pelo GET para
* adicionar ao carrinho
*/
for( $i = 0; $i < count( $numeros ) ; ++ $i ){
printf( '<input type="radio" class="radio-btn" value="%d" name="numero" />%d' ,
$numeros[ $i ] , $numeros[ $i ] );
só que está acontecendo os seguintes erros:
Notice: Undefined offset: 2 in C:\EasyPHP-5.3.6.0\www\DE-PAULA\CALCADOS\produtos.php on line 148
Notice: Undefined offset: 2 in C:\EasyPHP-5.3.6.0\www\DE-PAULA\CALCADOS\produtos.php on line 148
a linha 148 é essa do código:
$numeros[ $i ] , $numeros[ $i ] );
Oque está acontecendo de errado?
A chave do array que você está tentando acessar não existe.
>
Simplesmente os índices do array não existem.
Note que no seu for os números da variável $i serão sempre sequenciais, você tem certeza que no array eles estão organizados desta forma?
Faça um debug aí pra ver como o array está.
Antes do for coloque isso:
echo '<pre>' . print_r($numeros, true) . '</pre>' . PHP_EOL;
Cara fiz o debug aqui e printou dessa forma
Array
(
[2] => 37
[3] => 38
)
o produto tem seu tamanho de 35 a 38 (-35 e 36)
Então, o seu loop começa a contar no número 0 e o seu array começa com o índice 2, e pelo o que eu entendi pode variar.
Já tentou usar um foreach?
Leozitho, cara mudei o script aqui e está printando corretamente, agora, como faço para printar os input radio, só os numeros disponíveis?
agora está assim:
/**
* Faz um range ( entre ( de tamanho ) até ( a tamanho ) menos os números 'x,y,z...' )
*/
function available( array $arr , $unavailable ) {
return array_diff( $arr , explode( ',' , $unavailable ) );
}
$numeros = range( $dados[ 'detamanho' ] , $dados[ 'atamanho' ] );
echo '<td class="input">';
/**
* Mostra os tamanhos disponíveis
* o nome do input hidden já é o recuperado pelo GET para
* adicionar ao carrinho
*/
echo '<pre>';
print_r( available( range( $dados[ 'detamanho' ] , $dados[ 'atamanho' ] ) , '36,37' ) );
for( $i = 0; $i < count( $numeros ) ; ++ $i ){
printf( '<input type="radio" class="radio-btn" value="%d" name="numero" />%d' ,
$numeros[ $i ] , $numeros[ $i ] );Como assim o array está printando corretamente? Você quer dizer que agora ele está começando com o índice 0?
Se for isso, o for deveria já funcionar como o esperado. :S
Você pode deixar como estava e usar um foreach, assim:
foreach ($numeros as $numero) {
printf('<input type="radio" class="radio-btn" value="%d" name="numero" />%d', $numero, $numero);
}
Assim fica bem mais simples e menos confuso.
Ta funcionando ué,
olha só o produto aqui é de tamanho 35 a 38 (-35 e 37)
O array está printando assim:
Array
(
[1] => 36
[3] => 38
)
Então esta como eu queria, não?
Easy .. faz o seguinte
function available( array $arr , $unavailable ) {
return array_values( array_diff( $arr , explode( ',' , $unavailable ) ) );
}>
Então esta como eu queria, não?
Resolvido então?
No título do tópico e no primeiro post você colocou o erro "Undefined offset", este erro estava sendo causado porque você estava contando dentro do loop números a partir do zero para usar como índice do array, porém, o seu array não começava com este índice e nem se espera que ele tenha sempre os mesmos índices.
Por isso sugeri de você trocar o for pelo foreach, pois se sua intenção é apenas pegar os valores que estão no array $numeros, o foreach é a melhor opção.
>
Assim fica bem mais simples e menos confuso.
Concordo ..
>
Então esta como eu queria, não?
Não, a diferença está nos índices.
Deu certo aqui, obrigado Andrey e Leozitho!
Simplesmente os índices do array não existem.
Note que no seu for os números da variável $i serão sempre sequenciais, você tem certeza que no array eles estão organizados desta forma?
Faça um debug aí pra ver como o array está.
Antes do for coloque isso: