2009-10-20 5 views
5

que necesito para obtener los valores de las acciones de esta matriz:Perfil de Compatibilidad en un conjunto de teclas

Array ( 
[stock0] => 1 
[stockdate0] => 
[stock1] => 3 
[stockdate1] => apple 
[stock2] => 2 [ 
stockdate2] => 
) 

necesito perfil de compatibilidad en esta matriz, donde la clave de la matriz = "valores" + 1 carácter comodín. He intentado utilizar la función de filtro de matriz para obtener cualquier otro valor en el manual de PHP, pero los valores vacíos parecen arrojarlo. Intenté muchas cosas diferentes que encontré, pero nada está funcionando.

se puede hacer esto?

+0

¿Podemos ver la función que está pasando array_filter? –

+0

¿Qué es exactamente lo que intentas lograr? – Gumbo

+0

@ Jeff Ober función par ($ var) { retorno (($ var & 1)); !} print_r (array_filter ($ de valores "incluso")); @ Gumbo estoy del procesamiento de una forma que pase . las variables a una base de datos esta parte es para configurar el control de existencias en las variaciones de color se almacena la siguiente manera:. roja | azul | verde 1 | 2 | 3 || Feb 2010 La segunda línea se ejecuta 3 if declaraciones que muestran el mensaje apropiado (que si es el número 3 incorporará la fecha) De modo que cuando esto se muestra en el lado del navegador, simplemente puedo obtener los arreglos explotando los delimitadores. – Oliver

Respuesta

2

array_filter no tiene acceso a la clave y por lo tanto no es la herramienta adecuada para su trabajo.

Me creer lo que estás buscando a hacer es lo siguiente:

$stocks = Array ( 
"stock0" => 1, 
"stockdate0" => '', 
"stock1" => 3, 
"stockdate1" => 'apple', 
"stock2" => 2, 
"stockdate2" => '' 
); 


$stockList = array(); //Your list of "stocks" indexed by the number found at the end of "stock" 

foreach ($stocks as $stockKey => $stock) 
{ 
    sscanf($stockKey,"stock%d", &stockId); // scan into a formatted string and return values passed by reference 
    if ($stockId !== false) 
    $stockList[$stockId] = $stock; 
} 

Ahora $ stocklist se ve así:

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

Es posible que tenga que molestarse con él un poco, pero creo esto es lo que estás pidiendo.

SIN EMBARGO, realmente debería seguir los consejos de Jeff Ober si tiene la opción de hacerlo.

+0

Esto se ve bien.
Por el momento, sin embargo está volviendo
[0] => ''
[1] => manzana
[2] => ''

es decir, el stockdate en lugar del valor de las acciones
creo Puedo ajustarlo, ¡solo siéntete libre de ayudarme con eso también! – Oliver

+0

Acabo de intentar cambiar "stock% d" (valores erróneos) a "stockdate% d" que me dio los valores: [] => 1 [0] => 2 [1] => 3 [2] => '' . ¿Sabes cómo enderezar las llaves? – Oliver

4
<?php 

$foo = 
array ( 
'stock0' => 1, 
'stockdate0' => 1, 
'stock1' => 3, 
'stockdate1' => 2, 
); 

$keys = array_keys($foo); 
foreach ($keys as $key) { 
    if (preg_match('/stock.$/', $key)) { 
    var_dump($key); 
    } 
} 

estoy esperando interpreté correctamente y que quería 'stock', 1 carácter comodín eso no es un salto de línea, a continuación, final de la cadena.

+1

Esto parece la respuesta directa a la pregunta del OP.Aplicaría http://www.refactoring.com/catalog/inlineTemp.html a esta solución para deshacerme de la variable variable $ keys. –

+1

Solo dejé la variable temporal en caso de que fuera el motivo por el que quería usarlos de nuevo, y por lo general es más fácil captar a los novatos cuantas más variables hagas, en lugar de dificultar la comprensión de las expresiones. –

+0

Soy un gran admirador de RegEx y esto ciertamente podría hacerse de esta manera. – ChronoFish

4

Debe almacenar los que:

Array(
    [0] => Array(
    stock => 1, 
    stockdate => ... 
), 
    [1] => Array(
    stock => 3, 
    stockdate => apple 
), 
    ... 
) 
+1

En realidad estoy obteniendo esto de una matriz $ _POST. No parece tener muchas opciones en eso. – Oliver

0

Solución de trabajo aceptable: Verde para ChronoFish!

$stockList = array(); //Your list of "stocks" indexed by the number found at the end of "stock" 

foreach ($stock as $stockKey => $stock) 
{ 
    sscanf($stockKey,"message%d", $stockId); // scan into a formatted string and return values passed by reference 
    if ($stockId !== false) { 
    $stockList[$stockId] = $stock; 
} 

$stockList=array_values($stockList); //straightens array keys out 
$stockList = array_slice ($stockList, "0", $count); //gets rid of blank value generated at end of array (where $count = the array's orginal length) 
print_r ($stockList); 
1
# returns array('stock1' => 'foo') 
array_flip(preg_grep('#^stock.$#', array_flip(array('stock1' => 'foo', 'stockdate' => 'bar')))) 

No está seguro de lo bien que el rendimiento se debe a la expresión regular y dos saltos, pero excelente capacidad de mantenimiento (sin caza de errores en los bucles).

1

Desde PHP 5.6.0 la opción flag se ha agregado a array_filter. Esto le permite filtrar en función de las teclas de matriz en lugar de sus valores:

array_filter($items, function ($key) { 
    return preg_match('/^stock\d$/', $key); 
}, ARRAY_FILTER_USE_KEY); 
Cuestiones relacionadas