Сравните два массива и упорядочите их

#php #arrays

#php #массивы

Вопрос:

Я хочу сравнить два массива, а затем упорядочить один из них на основе ключевого поля.

 $arr_x[0] = array('name' => 'max', 'score' => '1');
$arr_x[1] = array('name' => 'june', 'score' => '2');
$arr_x[2] = array('name' => 'jacob', 'score' => '1');
$arr_x[3] = array('name' => 'john', 'score' => '4');



$arr_y[0] = array('name' => 'jacob', 'score' => '7');
$arr_y[1] = array('name' => 'john', 'score' => '6');
$arr_y[2] = array('name' => 'june', 'score' => '9');
 

Результат после нужного мне порядка…

 $arr_x[0] = array('name' => 'max', 'score' => '1');
$arr_x[1] = array('name' => 'june', 'score' => '2');
$arr_x[2] = array('name' => 'jacob', 'score' => '1');
$arr_x[3] = array('name' => 'john', 'score' => '4');

$arr_y[0] = array('name' => 'max', 'score' => '');
$arr_y[1] = array('name' => 'june', 'score' => '9');
$arr_y[2] = array('name' => 'jacob', 'score' => '7');
$arr_y[3] = array('name' => 'john', 'score' => '6');
 

Я был бы очень признателен за помощь, поскольку я не могу понять, как это сделать. Это пример, в реальном случае их может быть 20-50 в каждом.

Большое спасибо.

Комментарии:

1. Нет, я просто хочу сравнить эти два на основе ключевого поля «name», а затем упорядочить $arr_y в соответствии с первым массивом ($ arr_x).

2. $arr_x уже отсортирован так, как вы хотите?

Ответ №1:

Может быть лучший способ сделать это (меньше циклов), но вот мои два цента:

 $temp = $arr_z = array();

foreach ($arr_x as $k => $item) {
  $temp[$item['name']]['position_x'] = $k;
}

foreach ($arr_y as $k => $item) {
  if (isset($temp[$item['name']])) {
    $temp[$item['name']]['position_y'] = $k;
  }
}

foreach ($temp as $name => $data) {
  if (isset($data['position_y'])) {
    $arr_z[$data['position_x']] = $arr_y[$data['position_y']];
  } else {
    $arr_z[$data['position_x']] = array('name'=>$name,'score'=>'');
  }
}

$arr_y = $arr_z;
unset($arr_z);
 

Этот код не учитывает тот факт, что одно и то же имя может отображаться более одного раза или что может быть значение, если $arr_y оно не отображается в $arr_x .

Демонстрация здесь.

Комментарии:

1. Большое спасибо, это сработало. Могу ли я каким-либо образом добавить значения $arr_y, которые не отображаются в arr_x….to $arr_y, добавив еще один шаг?

2. Да, но это противоречит требованию order $arr_y according to the first array ($arr_x) . Где бы вы хотели, чтобы эти значения отображались в конечном массиве? В конце?

Ответ №2:

 $a1 = array();
$a2 = array();
// fill arrays with values / create two dimensional array
$a3 = array(); //this one will hold sorted array

foreach($a1 as $key => $val){
    if(array_key_exists($key,$a2)){
         // compare values for same key here
        $a3[$key] = $a2[$key]; //put the value and same key to final array
    }
    else {
        $a3[$key] = ''; //init key in final array to empty value
    }
}
 

Ответ №3:

Попробуйте это:

 $arr_y = array();

$arr_y[0] = array('name' => 'jacob', 'score' => '7');
$arr_y[1] = array('name' => 'john', 'score' => '6');
$arr_y[2] = array('name' => 'june', 'score' => '9');


$arr_z = array();

foreach($arr_y as $key => $value)
{
    $arr_z[$value['name']] = $value['score'];
}

$arr_x = array();

$arr_x[0] = array('name' => 'max', 'score' => '1');
$arr_x[1] = array('name' => 'june', 'score' => '2');
$arr_x[2] = array('name' => 'jacob', 'score' => '1');
$arr_x[3] = array('name' => 'john', 'score' => '4');

$arr_y_sorted = array();

foreach($arr_x as $key => $value)
{
    $arr_y_sorted[] = array('name' => $value['name'],'score' => isset($arr_z[$value['name']])?$arr_z[$value['name']]:'');    
}


print_r($arr_y_sorted);
 

Ответ №4:

Может быть лучший способ сделать это (меньше циклов), но вот мои два цента:

 $temp = $arr_z = array();

foreach ($arr_x as $k => $item) {
  $temp[$item['name']]['position_x'] = $k;
}

foreach ($arr_y as $k => $item) {
  if (isset($temp[$item['name']])) {
    $temp[$item['name']]['position_y'] = $k;
  }
}

foreach ($temp as $name => $data) {
  if (isset($data['position_y'])) {
    $arr_z[$data['position_x']] = $arr_y[$data['position_y']];
  } else {
    $arr_z[$data['position_x']] = array('name'=>$name,'score'=>'');
  }
}
 

Этот код не учитывает тот факт, что одно и то же имя может отображаться более одного раза или что может быть значение, если $arr_y оно не отображается в $arr_x .

Демонстрация здесь.