[PHP] Detectar Elementos repetidos en un vector.

Tengo un vector formado por frutas (string) y kilos (int), de la siguiente manera:

$vector = array(
"platano",15,
"naranja",1,
"platano",20,
"fresa",5,
"pera",1,
"kiwi",5,
"kiwi",10,
"manzana",20
"pera",2);


Y deseo obtener un vector que únicamente tengas las frutas (string) con sus kilos totales (int):

$vector = array(
"platano",35,
"naranja",1,
"fresa",5,
"pera",3,
"kiwi",15,
"manzana",20);


Sé que las posiciones 0 y pares tendrán siempre frutas y los impares los kilos.

Estoy utilizando la función array_keys() para poder detectar que frutas se repiten más de una vez y así poder conseguir el total de kilos, pero tengo el problema que no sé, cómo descartar las frutas que ya he tratado anteriormente y aparecian más de una vez; ya que la primera vez que lo detecto ya sacaría el total de kilos.

Igual el planteamiento no es el correcto y no debería utilizar la función array_keys(), ¿alguien propone otro planteamientomás apropiado?
¿Se trata de un ejercicio?
No entiendo por que se usa un array simple pudiendo usar un array asociativa.
skr33t escribió:¿Se trata de un ejercicio?
No entiendo por que se usa un array simple pudiendo usar un array asociativa.

No se trata de un ejercicio académico ;)

Es un desarrollo heredado en el que el vector está montado de tal manera.

Cómo digo en las posiciones 0 y pares, existe "la fruta". En los impares "la cantidad", me interesa poder tener en un vector únicamente una vez "la fruta" en las posiciones pares (0 incluido) y "la cantidad total" de dicha fruta en los impares.
@Newton
Hace mucho que no toco PHP, lo primero que se me ha ocurrido ha sido esto:
$vector = array(
"platano",15,
"naranja",1,
"platano",20,
"fresa",5,
"pera",1,
"kiwi",5,
"kiwi",10,
"manzana",20,
"pera",2);

$length = count($vector);
$nodup = array();
for($i=0; $i<=$length-1;$i+=2){
    if(array_key_exists($vector[$i],$nodup)) $nodup[$vector[$i]] += $vector[$i+1];
    else $nodup[$vector[$i]] = $vector[$i+1];
}

print_r($nodup);


Aquí lo puedes ver funcionando.
Gracias por entretenerme un rato [beer]
Gracias @skr33t pero una pregunta el vector origen tiene el formato:
array(18) { [0]=> string(7) "platano" [1]=> int(15) [2]=> string(7) "naranja" [3]=> int(1) [4]=> string(7) "platano" [5]=> int(20) [6]=> string(5) "fresa" [7]=> int(5) [8]=> string(4) "pera" [9]=> int(1) [10]=> string(4) "kiwi" [11]=> int(5) [12]=> string(4) "kiwi" [13]=> int(10) [14]=> string(7) "manzana" [15]=> int(20) [16]=> string(4) "pera" [17]=> int(2) }


El vector después de tratarlo en la función:
array(6) { ["platano"]=> int(35) ["naranja"]=> int(1) ["fresa"]=> int(5) ["pera"]=> int(3) ["kiwi"]=> int(15) ["manzana"]=> int(20) }


Cómo se podría devolver algo similar a:
array(12) { [0]=> string(7) "platano" [1]=> int(35) [2]=> string(7) "naranja" [3]=> int(1) [4]=> string(5) "fresa" [5]=> int(5) [6]=> string(4) "pera" [7]=> int(3) [8]=> string(4) "kiwi" [9]=> int(15) [10]=> string(7) "manzana" [11]=> int(20) }


Gracias [oki]
@Newton ¿Algo así?
$vector = array(
"platano",15,
"naranja",1,
"platano",20,
"fresa",5,
"pera",1,
"kiwi",5,
"kiwi",10,
"manzana",20,
"pera",2);

$length = count($vector);
$nodup = array();
for($i=0; $i<=$length-2;$i+=2){
    if(in_array($vector[$i], $nodup)){
     $nodup[array_search($vector[$i], $nodup)+1] += $vector[$i+1];
    }
    else {
      array_push($nodup, $vector[$i], $vector[$i+1]);
    }
}

print_r($nodup);


Aquí se ve funcionando. [beer]
Aunque me parece mejor el primer ejemplo convirtiendo el array en una asociativa, con un array asociativa es como si metieras las frutas en un saco, tal como está ahora es como si pusieras las frutas al lado del saco, o así lo veo yo.
¡Suerte!
@Karaculo
¿Para qué iba a ordenar los elementos de la array?
Usando sort en la array asociativa no tiene mucho sentido al ser solo 6 elementos y en la solución que quiere él desordenaría los valores de cada fruta...
skr33t escribió:@Newton ¿Algo así?
$vector = array(
"platano",15,
"naranja",1,
"platano",20,
"fresa",5,
"pera",1,
"kiwi",5,
"kiwi",10,
"manzana",20,
"pera",2);

$length = count($vector);
$nodup = array();
for($i=0; $i<=$length-2;$i+=2){
    if(in_array($vector[$i], $nodup)){
     $nodup[array_search($vector[$i], $nodup)+1] += $vector[$i+1];
    }
    else {
      array_push($nodup, $vector[$i], $vector[$i+1]);
    }
}

print_r($nodup);


Aquí se ve funcionando. [beer]
Aunque me parece mejor el primer ejemplo convirtiendo el array en una asociativa, con un array asociativa es como si metieras las frutas en un saco, tal como está ahora es como si pusieras las frutas al lado del saco, o así lo veo yo.
¡Suerte!

Solucionado y gracias de nuevo @skr33t
Es cierto que es más lógico y mejor lo que me propones en la 1 solución, pero en este caso particular tengo que optar por la 2 ya que en el desarrollo que he heredado, existen cosas que trabajan con el tipo de datos que te he comentado.
Si empezará el desarrollo desde 0, si es más lógica tu propuesta.
@Newton
¿De qué forma parte el código?¿Qué estás haciendo?
Por cierto, para esas dudas te recomiendo una página que se llama stackoverflow, es muy útil para pedir ayuda en las dudas que tengas en tu código y para resolver problemas a otros programadores. Te van a responder casi inmediatamente y normalmente lo hace gente experiementada, yo por ejemplo no tengo ni idea de PHP, he tenido que buscar equivalencias de JS.
Vuelvo a editar: No quiero hacer publicidad, es solo que no existe una categoría en el foro adecuada para programación.
skr33t escribió:@Newton
¿De qué forma parte el código?¿Qué estás haciendo?
Por cierto, para esas dudas te recomiendo una página que se llama stackoverflow, es muy útil para pedir ayuda en las dudas que tengas en tu código y para resolver problemas a otros programadores. Te van a responder casi inmediatamente y normalmente lo hace gente experiementada, yo por ejemplo no tengo ni idea de PHP, he tenido que buscar equivalencias de JS.
Vuelvo a editar: No quiero hacer publicidad, es solo que no existe una categoría en el foro adecuada para programación.

Primero agradecerte la ayuda, sé de la existencia de StackOverFlow, pero me gusta bastante más EOL; aunque es posible que no sea la misma temática.
En EOL he encontrado foro_multiplataforma-desarrollo_152 pero no sé si realmente es el lugar apropiado.
No sé si habría volumen para tener un apartado específico aunque podría ser interesante para la gente que empieza a programar.
Respecto a de qué forma parte, es un desarrollo interno para la empresa para agilizar unos procesos en lugar de hacer comprobaciones manuales para hacerlo de manera automática.
10 respuestas