كيفية تصفية صفيف حسب الشرط
-
19-09-2019 - |
سؤال
لدي مجموعة مثل هذا:
array("a" => 2, "b" => 4, "c" => 2, "d" => 5, "e" => 6, "f" => 2)
الآن أريد تصفية الصفيف من خلال بعض الشرط ويحتفظ فقط بالعناصر حيث تكون القيمة تساوي 2 وحذف جميع العناصر حيث تكون القيمة ليست 2.
لذلك فإن مجموعة النتائج المتوقعة هي:
array("a" => 2, "c" => 2, "f" => 2)
ملاحظة: أريد أن أبقي المفاتيح من الصفيف الأصلي.
كيف يمكنني أن أفعل ذلك مع PHP؟ أي وظائف مدمجة؟
المحلول
$fullarray = array('a'=>2,'b'=>4,'c'=>2,'d'=>5,'e'=>6,'f'=>2);
function filterArray($value){
return ($value == 2);
}
$filteredArray = array_filter($fullArray, 'filterArray');
foreach($filteredArray as $k => $v){
echo "$k = $v";
}
نصائح أخرى
يجب عليك بطريقة أو بأخرى حلقة من خلال صفيفك وتصفية كل عنصر حسب حالتك. يمكن القيام بذلك مع طرق مختلفة.
حلقات while
/ for
/ foreach
طريقة
حلقة من خلال صفيفك مع أي حلقة تريدها، قد يكون while
, for
أو foreach
. وبعد ثم ببساطة تحقق من وجود حالتك unset()
العناصر إذا لم تلبي حالتك أو تكتب العناصر، والتي تلبي الشرط، في صفيف جديد.
حلق
//while loop
while(list($key, $value) = each($array)){
//condition
}
//for loop
$keys = array_keys($array);
for($counter = 0, $length = count($array); $counter < $length; $counter++){
$key = $keys[$counter];
$value = $array[$key];
//condition
}
//foreach loop
foreach($array as $key => $value){
//condition
}
شرط
فقط ضع حالتك في الحلقة حيث التعليق //condition
هو. الشرط يمكن فقط التحقق من ما تريد ثم يمكنك إما unset()
العناصر التي لا تلبي حالتك، وأرجع الصفيف array_values()
إذا كنت تريد، أو اكتب العناصر في صفيف جديد يلبي الحالة.
//Pseudo code
//Use one of the two ways
if(شرط){ //1. Condition fulfilled
$newArray[ ] = $value;
//↑ Put '$key' there, if you want to keep the original keys
//Result array is: $newArray
} else { //2. Condition NOT fulfilled
unset($array[$key]);
//Use array_values() after the loop if you want to reindex the array
//Result array is: $array
}
array_filter()
طريقة
طريقة أخرى هي استخدام array_filter()
وظيفة مدمجة. يعمل بشكل عام إلى حد كبير نفس الطريقة مع حلقة بسيطة.
تحتاج فقط إلى العودة TRUE
إذا كنت ترغب في الحفاظ على العنصر في الصفيف و FALSE
إذا كنت ترغب في إسقاط العنصر من صفيف النتائج.
//Anonymous function
$newArray = array_filter($array, function($value, $key){
//condition
}, ARRAY_FILTER_USE_BOTH);
//Function name passed as string
function filter($value, $key){
//condition
}
$newArray = array_filter($array, "filter", ARRAY_FILTER_USE_BOTH);
//'create_function()', NOT recommended
$newArray = array_filter($array, create_function('$value, $key', '/* condition */'), ARRAY_FILTER_USE_BOTH);
preg_grep()
طريقة
preg_grep()
مشابه ل array_filter()
فقط أنه يستخدم فقط تعبير منتظم لتصفية الصفيف. لذلك قد لا تكون قادرا على القيام بكل شيء به، حيث يمكنك فقط استخدام تعبير منتظم كمرشح ويمكنك تصفية القيم فقط أو مع بعض التعليمات البرمجية بمفاتيح.
لاحظ أيضا أنه يمكنك تمرير العلم PREG_GREP_INVERT
كما المعلمة الثالثة لتحريك النتائج.
//Filter by values
$newArray = preg_grep("/regex./", $array);
الظروف الشائعة
هناك العديد من الشروط الشائعة المستخدمة لتصفية مجموعة يمكن تطبيقها جميعها على قيمة ومفتاح الصفيف. سوف قائمة فقط عدد قليل منهم هنا:
//القيم الفردية
return $value & 1;
//حتى القيم
return !($value & 1);
//لا القيم null.
return !is_null($value);
//ليس 0 القيم
return $value !== 0;
//تحتوي على قيم قيمة معينة
return strpos($value, $needle) !== FALSE; //Use 'use($needle)' to get the var into scope
//تحتوي على بعض السلسلة الفرعية في قيم الموضع
return substr($value, $position, $length) === $subString;
//ليس "فارغة" (رابط) القيم
array_filter($array); //Leave out the callback parameter
يمكنك التكرار على نسخ المفاتيح لتكون قادرة على استخدام unset()
في الحلقة:
foreach (array_keys($array) as $key) {
if ($array[$key] != 2) {
unset($array[$key]);
}
}
ميزة هذه الطريقة هي كفاءة الذاكرة إذا كان صفيفك يحتوي على قيم كبيرة - فهي غير مكررة.
تعديل لقد لاحظت للتو، أنك تحتاج فعلا فقط إلى المفاتيح التي لها قيمة 2 (تعرف بالفعل القيمة):
$keys = array();
foreach ($array as $key => $value) {
if ($value == 2) {
$keys[] = $key;
}
}
يجب أن يعمل هذا، لكنني لست متأكدا من مدى كفاءة الأمر كما أنه ربما ينتهي بك الأمر إلى نسخ الكثير من البيانات.
$newArray = array_intersect_key(
$fullarray,
array_flip(array_keys($fullarray, 2))
);
أعتقد أن وظيفة Snappiest، مقروءة مقروءة هي: array_intersect ()
شفرة: (التجريبي)
$array = array("a" => 2, "b" => 4, "c" => 2, "d" => 5, "e" => 6, "f" => 2);
var_export(array_intersect($array, [2]));
انتاج:
array (
'a' => 2,
'c' => 2,
'f' => 2,
)
فقط تأكد من أنك تعلن المعلمة الثانية كصفيف لأن هذا هو نوع القيمة المتوقع.
الآن لا يوجد شيء خاطئ في كتابة حلقة foreach، أو استخدام array_filter()
, ، لديهم فقط بناء جملة فيربوز.
array_intersect()
من السهل جدا تمديده (تضمين قيم إضافية "مؤهلة") عن طريق إضافة المزيد من القيم إلى صفيف المعلمة 2nd.
foreach ($aray as $key => $value) {
if (2 != $value) {
unset($array($key));
}
}
echo 'Items in array:' . count($array);
قد أفعل شيئا مثل:
$newarray = array();
foreach ($jsonarray as $testelement){
if ($testelement == 2){$newarray[]=$testelement}
}
$result = count($newarray);