2016-05-11 1 views
1

J'ai trébuché sur un insecte obscur qui m'a pris beaucoup de temps à réparer et je suis vaguement curieux de la cause sous-jacente. Quelqu'un pourrait-il faire la lumière sur l'anomalie que je vois en utilisant la fonction array_filter au lieu d'une simple boucle.Pourquoi la sortie rendue par json de array_filter est-elle différente de celle de foreach?

j'aurais pensé les deux blocs de code suivant le même résultat:

// original 'buggy' version 
$obj_to->ExtendedProperties[] = array_filter($extendedProperties, function($item){ 
    return isset($item); 
}); 

// later, working version 
foreach ($extendedProperties as $prop) { 
    if (isset($prop)) $obj_to->ExtendedProperties[] = $prop; 
} 

Cependant, l'API auquel j'étais alors d'envoyer les résultats ne considéraient pas leur équivalent de sortie et a renvoyé une erreur 400. J'ai inclus des échantillons des différentes sorties de JSON. Dans un cas, nous voyons un indice de tableau dans le json imprimé et dans l'autre, nous ne le faisons pas.

// 'good' json 
"ExtendedProperties": [ 
    { 
    "Name": "MaterialCode", 
    "Value": "5450790E0LD048P8" 
    }, 
... 

par opposition à

// 'bad' json 
"ExtendedProperties": { 
    "0": { 
     "Name": "PreferredDate", 
     "Value": "2016-06-01" 
    }, 
... 

Répondre

1

Vous obtenez la sortie JSON "mauvais" parce que array_filter conserve les clés du tableau de $extendedProperties Array.

http://php.net/manual/en/function.array-filter.php#99358

Parce que array_filter() préserve les clés, vous devriez considérer le tableau résultant d'être un tableau associatif, même si le tableau d'origine avait des touches entières car il peut y avoir des trous dans votre séquence de touches. Cela signifie que, par exemple, json_encode() convertira votre tableau de résultats en un objet au lieu d'un tableau. Appelez array_values ​​() sur le tableau result pour vous assurer que json_encode() vous donne un tableau.

+0

Merci. J'ai supposé à tort qu'il fonctionnerait comme la méthode filter() de javascript. On dirait que c'était une autre situation où la lecture de la documentation aurait aidé. – trevorgk

0

array_filter est un tableau retour, c'est pourquoi vous avez tableau de tableau.

Je pense qu'il a raison:

$obj_to->ExtendedProperties = array_filter($extendedProperties, function($item){ 
    return isset($item); 
});