العد من عدة صفائف متعددة الأبعاد
سؤال
لدي foreach، والتي تولد المصفوفات التالية:
==== array 1 ====
array
0 =>
array
'tag' => string 'daf' (length=3)
1 =>
array
'tag' => string 'daa' (length=3)
2 =>
array
'tag' => string 'daf' (length=3)
3 =>
array
'tag' => string 'daaa' (length=4)
4 =>
array
'tag' => string 'daf' (length=3)
5 =>
array
'tag' => string 'daa' (length=3)
6 =>
array
'tag' => string 'daf' (length=3)
7 =>
array
'tag' => string 'daf' (length=3)
8 =>
array
'tag' => string 'daf' (length=3)
9 =>
array
'tag' => string 'abd' (length=3)
10 =>
array
'tag' => string 'abdaa' (length=5)
11 =>
array
'tag' => string 'abda' (length=4)
==== array 2 ====
array
0 =>
array
'tag' => string 'daf' (length=3)
1 =>
array
'tag' => string 'test1' (length=5)
كإخراج أريد الحصول على شيء مثل:
array
'daf' => '7'
'daa' => '2'
'daaa' => '1'
'abd' => '1'
'abdaa' => '1'
'abda' => '1'
'test1' => '1'
قيمة المصفوفة الجديدة هي عدد العناصر من جميع المصفوفات التي تم إنشاؤها من الحلقة.array_count_values() لا تعمل هنا...هل هناك أي اقتراحات حول كيفية حل المشكلة؟
المحلول
شيء مثل هذا يجب أن يعمل:
$result = array();
foreach (array_merge($array1, $array2) as $item) {
$name = $item['tag'];
if (!isset($result[$name])) {
$result[$name] = 0;
}
$result[$name]++;
}
نصائح أخرى
لم ألاحظ أنه كان مجموعة ثنائية الأبعاد.
هنا رمز آخر.
var_export(
array_count_values(
call_user_func_array('array_merge', array_merge($array1, $array2))
)
);
دعونا نستفيد من بعض مكتبة PHP القياسية (SPL).
يمكنك "تسطيح" مصفوفة باستخدام RecursiveArrayIterator و تكراريIterator.ونتيجة لذلك، تحصل على مُكرِّر يزور كل صفحة من المصفوفة ذات الأبعاد n ويتيح لك الوصول إلى المفتاح الفعلي للعنصر.في الخطوة التالية، قم بربط كل من RecursiveIteratorIterators مع ملف AppendIterator يتصرف كمتفاعل واحد يزور كل عنصر في جميع التكرارات الداخلية (الملحقة).
$ai = new AppendIterator;
$ai->append(new RecursiveIteratorIterator(new RecursiveArrayIterator($array1)));
$ai->append(new RecursiveIteratorIterator(new RecursiveArrayIterator($array2)));
$counters = array();
foreach($ai as $key=>$value) {
if ( 'tag'===$key ) {
// @ because I don't care whether this array element exists beforehand or not.
// $value has to be something that can be used as an array key (strings in this case)
@$counters[$value] += 1;
}
}
إذا كنت تريد يمكنك حتى استخدام FilterIterator بدلا من ال if('tag'===$key)
.لكن إيمهو هذا لا يزيد من سهولة قراءة/قيمة الكود ؛-)