Básicamente tengo esta matriz:

$foo[0] = array("name" => "A", "apples" => "2");
$foo[1] = array("name" => "B", "apples" => "4");
$foo[2] = array("name" => "C", "apples" => "6");
$foo[3] = array("name" => "A", "apples" => "3");
$foo[4] = array("name" => "B", "apples" => "5");
$foo[5] = array("name" => "C", "apples" => "7");

Y quiero esto:

$foo[0] = array("name" => "A", "apple1" => "2", "apple2" => "3");
$foo[1] = array("name" => "B", "apple1" => "4", "apple2" => "5");
$foo[2] = array("name" => "C", "apple1" => "6", "apple2" => "7");
-1
Frenk 23 ene. 2018 a las 19:17

3 respuestas

La mejor respuesta

Puede hacer el bucle clásico foreach:

$foo[0] = array("name" => "A", "apples" => "2");
$foo[1] = array("name" => "B", "apples" => "4");
$foo[2] = array("name" => "C", "apples" => "6");
$foo[3] = array("name" => "A", "apples" => "3");
$foo[4] = array("name" => "B", "apples" => "5");
$foo[5] = array("name" => "C", "apples" => "7");

$result = array();
foreach( $foo as $value ) {
    if ( !isset( $result[ $value[ "name" ] ] ) ) {
        $result[ $value[ "name" ] ] = array();
        $result[ $value[ "name" ] ][ "name" ] = $value[ "name" ];
        $result[ $value[ "name" ] ][ "apple1" ] = $value[ "apples" ];
    } else {
        $cnt = count( $result[ $value[ "name" ] ] );
        $result[ $value[ "name" ] ][ "apple" . $cnt ] = $value[ "apples" ];
    }
}

//returns all the values from the array and indexes the array numerically.
$result = array_values( $result );

echo "<pre>";
print_r( $result );
echo "</pre>";

Esto resultará en:

Array
(
    [0] => Array
        (
            [name] => A
            [apple1] => 2
            [apple2] => 3
        )

    [1] => Array
        (
            [name] => B
            [apple1] => 4
            [apple2] => 5
        )

    [2] => Array
        (
            [name] => C
            [apple1] => 6
            [apple2] => 7
        )

)
0
Eddie 23 ene. 2018 a las 16:25

Siempre que use matrices, use matrices en lugar de cadenas numeradas como:

$foo[0] = array("name" => "A", "apples" => array("2", "3"));

Haga un bucle e indexe el resultado por el valor name y agregue dinámicamente el valor apples a la matriz apples:

foreach($foo as $v) {
    $result[$v['name']]['name'] = $v['name'];
    $result[$v['name']]['apples'][] = $v['apples'];
}

Luego, si es necesario volver a indexar:

$result = array_values($result);
1
AbraCadaver 23 ene. 2018 a las 16:30

¿Son estos resultados de una base de datos?

Si es así, probablemente podría hacer esto en una línea con alguna combinación de las constantes PDO: https: // phpdelusions. net / pdo / fetch_modes # FETCH_UNIQUE

Yo miraría PDO::FETCH_UNIQUE o PDO::FETCH_GROUP, también se pueden combinar así PDO::FETCH_UNIQUE|PDO::FETCH_GROUP

De lo contrario, la consulta en sí misma también puede proporcionar esta información con GROUP BY

0
arcanine 23 ene. 2018 a las 16:38
48406290