Certains éléments de mon tableau sont des chaînes vides basées sur ce que l'utilisateur a soumis. Je dois enlever ces éléments. J'ai ceci:
foreach($linksArray as $link)
{
if($link == '')
{
unset($link);
}
}
print_r($linksArray);
Mais cela ne fonctionne pas, $linksArray
a toujours des éléments vides. J'ai également essayé de le faire avec la fonction empty()
mais le résultat est le même.
Comme vous avez affaire à un tableau de chaînes, vous pouvez simplement utiliser array_filter()
, qui gère facilement tout cela pour vous:
print_r(array_filter($linksArray));
Gardez à l'esprit que si aucun rappel n'est fourni, toutes les entrées du tableau égal à FALSE
(voir conversion en boolean ) seront supprimées. Donc, si vous devez conserver des éléments qui sont, par exemple, la chaîne exacte '0'
, vous aurez besoin d’un rappel personnalisé:
// PHP < 5.3
print_r(array_filter($linksArray, create_function('$value', 'return $value !== "";')));
// PHP 5.3 and later
print_r(array_filter($linksArray, function($value) { return $value !== ''; }));
Vous pouvez utiliser array_filter
pour supprimer des éléments vides:
$emptyRemoved = array_filter($linksArray);
Si vous avez (int) 0
dans votre tableau, vous pouvez utiliser les éléments suivants:
$emptyRemoved = remove_empty($linksArray);
function remove_empty($array) {
return array_filter($array, '_remove_empty_internal');
}
function _remove_empty_internal($value) {
return !empty($value) || $value === 0;
}
EDIT: Peut-être que vos éléments ne sont pas vides en eux-mêmes mais contiennent un ou plusieurs espaces ... Vous pouvez utiliser ce qui suit avant d'utiliser array_filter
$trimmedArray = array_map('trim', $linksArray);
$linksArray = array_filter($linksArray);
"Si aucun rappel n'est fourni, toutes les entrées ayant la valeur FALSE seront supprimées." - http://php.net/manual/en/function.array-filter.php
La réponse la plus populaire sur ce sujet est absolument INCORRECT.
Considérez le script PHP suivant:
<?php
$arr = array('1', '', '2', '3', '0');
// Incorrect:
print_r(array_filter($arr));
// Correct:
print_r(array_filter($arr, 'strlen'));
Pourquoi est-ce? Etant donné qu'une chaîne contenant un seul caractère '0' est également évaluée à booléen, elle sera donc filtrée même si elle n'est pas vide. Ce serait un bug.
Le fait de passer la fonction strlen intégrée en tant que fonction de filtrage fonctionnera, car elle renvoie un entier non nul pour une chaîne non vide et un entier nul pour une chaîne vide. Les entiers non nuls sont toujours évalués sur true lors de la conversion en booléen, alors que les entiers zéro sont toujours évalués sur false lors de la conversion en boolean.
Donc, la réponse absolue, définitive et correcte est:
$arr = array_filter($arr, 'strlen');
$myarray = array_filter($myarray, 'strlen'); //removes null values but leaves "0"
$myarray = array_filter($myarray); //removes all null values
Vous pouvez juste faire
array_filter($array)
array_filter: "Si aucun rappel n'est fourni, toutes les entrées d'entrées égales à FALSE seront supprimées." Cela signifie que les éléments avec les valeurs NULL, 0, '0', '', FALSE, array () seront également supprimés.
L'autre option est de faire
array_diff($array, array(''))
qui supprimera les éléments avec les valeurs NULL, '' et FALSE.
J'espère que cela t'aides :)
Voici un exemple.
$a = array(0, '0', NULL, FALSE, '', array());
var_dump(array_filter($a));
// array()
var_dump(array_diff($a, array(0))) // 0 / '0'
// array(NULL, FALSE, '', array());
var_dump(array_diff($a, array(NULL))) // NULL / FALSE / ''
// array(0, '0', array())
Pour résumer:
foreach($linksArray as $key => $link)
{
if($link === '')
{
unset($linksArray[$key]);
}
}
print_r($linksArray);
Une autre ligne pour supprimer les éléments vides ("" chaîne vide) de votre tableau.
$array = array_filter($array, create_function('$a','return $a!=="";'));
Remarque: Ce code conserve délibérément les éléments null, 0 et false.
Ou peut-être voulez-vous d'abord couper vos éléments de tableau:
$array = array_filter($array, create_function('$a','return trim($a)!=="";'));
Remarque: Ce code supprime également les éléments null et false.
Ceci est mon code suggéré:
$myarray = array_values(array_filter(array_map('trim', $myarray), 'strlen'));
Je pense que l'utilisation de array_filter
est bonne, mais pas suffisante, car les valeurs ressemblent à space
et \n
, ... à conserver dans le tableau et c'est généralement mauvais.
Je vous suggère donc d'utiliser le mélange array_filter
et array_map
.
array_map
est pour le rognage, array_filter
est pour supprimer les valeurs vides, strlen
est pour garder 0
valeur, et array_values
pour indexer si nécessaire.
$myarray = array("\r", "\n", "\r\n", "", " ", "0", "a");
// "\r", "\n", "\r\n", " ", "a"
$new1 = array_filter($myarray);
// "a"
$new2 = array_filter(array_map('trim', $myarray));
// "0", "a"
$new3 = array_filter(array_map('trim', $myarray), 'strlen');
// "0", "a" (reindex)
$new4 = array_values(array_filter(array_map('trim', $myarray), 'strlen'));
var_dump($new1, $new2, $new3, $new4);
array(5) {
[0]=>
" string(1) "
[1]=>
string(1) "
"
[2]=>
string(2) "
"
[4]=>
string(1) " "
[6]=>
string(1) "a"
}
array(1) {
[6]=>
string(1) "a"
}
array(2) {
[5]=>
string(1) "0"
[6]=>
string(1) "a"
}
array(2) {
[0]=>
string(1) "0"
[1]=>
string(1) "a"
}
Si vous travaillez avec un tableau numérique et que vous devez le réindexer après avoir supprimé les éléments vides, utilisez la fonction array_values :
array_values(array_filter($array));
Voir aussi: PHP tableau de réindexation?
La réponse la plus votée est faux ou du moins pas tout à fait vraie car le PO ne parle que de chaînes vierges. Voici une explication détaillée:
Tout d’abord, nous devons nous mettre d’accord sur ce que empty signifie. Voulez-vous dire filtrer:
$element === false
)empty()
de PHP?Pour filtrer chaînes vides uniquement:
$filtered = array_diff($originalArray, array(""));
Pour filtrer uniquement les valeurs strictement false, vous devez utiliser une fonction callback:
$filtered = array_diff($originalArray, 'myCallback');
function myCallback($var) {
return $var === false;
}
Le rappel est également utile pour toute combinaison dans laquelle vous souhaitez filtrer les valeurs "falsey", sauf certaines. (Par exemple, filtrez toutes les null
et false
, etc., en ne laissant que 0
):
$filtered = array_filter($originalArray, 'myCallback');
function myCallback($var) {
return ($var === 0 || $var === '0');
}
Les troisième et quatrième cas sont équivalents (enfin, à nos fins), et pour cela tout ce que vous devez utiliser est la valeur par défaut:
$filtered = array_filter($originalArray);
$a = array(1, '', '', '', 2, '', 3, 4);
$b = array_values(array_filter($a));
print_r($b)
Pour tableau multidimensionnel
$data = array_map('array_filter', $data);
$data = array_filter($data);
J'utilise le script suivant pour supprimer des éléments vides d'un tableau
for ($i=0; $i<$count($Array); $i++)
{
if (empty($Array[$i])) unset($Array[$i]);
}
Je devais le faire pour conserver une valeur de tableau de (chaîne) 0
$url = array_filter($data, function ($value) {
return (!empty($value) || $value === 0 || $value==='0');
});
$out_array = array_filter($input_array, function($item)
{
return !empty($item['key_of_array_to_check_whether_it_is_empty']);
}
);
function trim_array($Array)
{
foreach ($Array as $value) {
if(trim($value) === '') {
$index = array_search($value, $Array);
unset($Array[$index]);
}
}
return $Array;
}
foreach($arr as $key => $val){
if (empty($val)) unset($arr[$key];
}
Je veux juste apporter une alternative aux boucles ... tout en comblant les lacunes dans les clés ...
Dans mon cas, je souhaitais conserver des clés de tableau séquentielles à la fin de l'opération (pas uniquement des nombres impairs, mais c'est ce que je cherchais. Configurer du code pour rechercher uniquement des clés impaires me semblait fragile et non futuriste.)
Je cherchais quelque chose de plus semblable à ceci: http://gotofritz.net/blog/howto/removing-empty-array-elements-php/
La combinaison de array_filter et array_slice fait l'affaire.
$example = array_filter($example);
$example = array_slice($example,0);
Aucune idée sur l'efficacité ou les points de repère, mais ça marche.
Juste une ligne: Update (merci à @suther):
$array_without_empty_values = array_filter($array);
$my = ("0"=>" ","1"=>"5","2"=>"6","3"=>" ");
foreach ($my as $key => $value) {
if (is_null($value)) unset($my[$key]);
}
foreach ($my as $key => $value) {
echo $key . ':' . $value . '<br>';
}
sortie
1: 5
2: 6
utilisez la fonction array_filter
pour supprimer les valeurs vides:
$linksArray = array_filter($linksArray);
print_r($linksArray);
Supprimer des éléments de tableau vides
function removeEmptyElements(&$element)
{
if (is_array($element)) {
if ($key = key($element)) {
$element[$key] = array_filter($element);
}
if (count($element) != count($element, COUNT_RECURSIVE)) {
$element = array_filter(current($element), __FUNCTION__);
}
return $element;
} else {
return empty($element) ? false : $element;
}
}
$data = array(
'horarios' => array(),
'grupos' => array(
'1A' => array(
'Juan' => array(
'calificaciones' => array(
'Matematicas' => 8,
'Español' => 5,
'Ingles' => 9,
),
'asistencias' => array(
'enero' => 20,
'febrero' => 10,
'marzo' => '',
)
),
'Damian' => array(
'calificaciones' => array(
'Matematicas' => 10,
'Español' => '',
'Ingles' => 9,
),
'asistencias' => array(
'enero' => 20,
'febrero' => '',
'marzo' => 5,
)
),
),
'1B' => array(
'Mariana' => array(
'calificaciones' => array(
'Matematicas' => null,
'Español' => 7,
'Ingles' => 9,
),
'asistencias' => array(
'enero' => null,
'febrero' => 5,
'marzo' => 5,
)
),
),
)
);
$data = array_filter($data, 'removeEmptyElements');
var_dump($data);
Ça marche!
essayez ceci ** ** Exemple
$or = array(
'PersonalInformation.first_name' => $this->request->data['User']['first_name'],
'PersonalInformation.last_name' => $this->request->data['User']['last_name'],
'PersonalInformation.primary_phone' => $this->request->data['User']['primary_phone'],
'PersonalInformation.dob' => $this->request->data['User']['dob'],
'User.email' => $this->request->data['User']['email'],
);
$or = array_filter($or);
$condition = array(
'User.role' => array('U', 'P'),
'User.user_status' => array('active', 'lead', 'inactive'),
'OR' => $or
);
Selon votre méthode, vous pouvez simplement attraper ces éléments dans un autre tableau et utiliser celui-ci comme suit:
foreach($linksArray as $link){
if(!empty($link)){
$new_arr[] = $link
}
}
print_r($new_arr);