سؤال

لدي مجموعة مثل هذا:

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);
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top