#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
.